2017-06-21 64 views
1

扩展该解决方案的最终结果:Calculate Final outcome based on Results/ID计算基于结果/ ID为多个字段

使用相同的业务逻辑,我怎么能获得基于该LA场旁边Final Result另一Final Result 2基于Employment场?当涉及多个领域时,排名功能显然会有所不同。

表T1扩展:

+----------+-----------+-----------------+-----------------+ 
| PersonID | Date | Employment |  LA  | 
+----------+-----------+-----------------+-----------------+ 
|  1 | 2/28/2017 | Stayed the same | Improved  | 
|  1 | 4/21/2017 | Stayed the same | Stayed the same | 
|  1 | 5/18/2017 | Stayed the same | Improved  | 
|  2 | 3/7/2017 | Improved  | Stayed the same | 
|  2 | 4/1/2017 | Stayed the same | Stayed the same | 
|  2 | 6/1/2017 | Stayed the same | Improved  | 
|  3 | 3/28/2016 | Improved  | Improved  | 
|  3 | 5/4/2016 | Improved  | Improved  | 
|  3 | 4/19/2017 | Worsened  | Worsened  | 
|  4 | 5/19/2016 | Worsened  | Stayed the same | 
|  4 | 2/16/2017 | Improved  | Stayed the same | 
+----------+-----------+-----------------+-----------------+ 

所需的输出:

+----------+-----------------+-----------------+ 
| PersonID | Final Result | Final Result 2 | 
+----------+-----------------+-----------------+ 
|  1 | Stayed the same | Improved  | 
|  2 | Improved  | Improved  | 
|  3 | Worsened  | Worsened  | 
|  4 | Improved  | Stayed the same | 
+----------+-----------------+-----------------+ 
+0

也许更好的表设计会有所帮助。不是将值存储为VarChar,而是将它们作为整数和表格查找文本。用整数你可以使用Min()或Max()来找到你想要的值。 – Degan

+0

@vkp正如我在原始线程中提到的那样,与“最终结果2”的“最终结果”具有相同的业务逻辑。即如果每个人保持一致,则保持不变。如果变差/改进,那么最新的W/I。 – AS91

回答

1

添加另一个RN应该工作

select t1.personid, t1.employment, t2.LA 
from (select t1.*, 
       row_number() over (partition by personid 
           order by (case when employment <> 'Stayed the same' then 1 else 2 end), 
              date desc 
           ) as seqnum 
     from t1 
     ) t1 
left join 
    (select t1.PersonID, t1.LA, 
       row_number() over (partition by personid 
           order by (case when LA <> 'Stayed the same' then 1 else 2 end), 
              date desc 
           ) as seqnum 
     from t1) t2 on t2.PersonID = t1.PersonID and t2.seqnum = 1 
where t1.seqnum = 1 
+0

您能否在ORDER BY子句的CASE语句中解释序号?他们提及哪些领域以及为什么序数?为什么不直接在这里输入域名?如果我理解正确,1是personid,2是Date。但是直接使用字段名会导致各种数据类型错误。 – AS91

+0

我采用了与你接受的gordon相同的逻辑,它适用于任何不是'保持不变'的东西。回想起来,它可能应该是=而不是<>,但是我接受了同样的逻辑,因为你接受了它。不同的是我在看洛杉矶而不是就业。你在哪里得到一个错误? – scsimon

+0

CASE中使用的逻辑通过<>得到期望的结果。在同一个查询中,如果我在ORDER BY中用'PersonID'和'Date'替换1和2,则会得到'操作数类型冲突:int与日期不兼容'错误。序号和实际字段名称不是相同的东西吗?另外,如果结果= W/I,则它将首先按日期升序和日期降序排序。这没有意义。而排序1应该没有区别,因为它们在每个分区中都是相同的ID。我错过了什么? – AS91