2017-06-20 113 views
0

最后的结局对于表T1计算基于结果/ ID

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

我试图来计算就业/是PersonID字段Final Result领域划分,基于相对于之前的结果的最新结果/人上。我的意思是在逻辑解释背后Final Result

的每个人,

  1. 如果所有的结果/人都保持不变,那么只应该最终 结果的那个人是“沉祥福同样的”

  2. 如果变差了/改进 是在结果的人所设定的,最终的结果应该是 最新变差了/提升了该人的结果,不论‘保持不变’一个后W/I结果。

例如:

  • 人1的最终结果 - >保持不变,按(1)
  • 人2的最终结果 - >提高,为全(2)
  • 人3最终结果 - >恶化,按照(2)
  • 人4最终结果 - >改进,按照(2)

所需的结果:

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

我知道这可能涉及到窗口函数或子查询,但我竭力实现代码。

+0

分区ROW_NUMBER()会得到你想要有一个CASE表达式或IIF – Matt

回答

1

嗯。这是一个优先级查询。这听起来像row_number()是呼吁:

select t1.personid, t1.employment 
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 
where seqnum = 1; 
+0

如果我加入了类似就业计算相关的'最终结果另一场将这个也行2'字段? – AS91

+0

@ AS91。 。 。如果你有另一个问题,那就把它当作另一个问题而不是在评论中。一旦已经回答了问题,不要更改问题 - 这可以使答案无效并吸引低价提问。 –

+0

我认为我会在简化问题和以更高级别复制结果之间取舍,但要以牺牲复杂性为代价。根据特定的领域排序结果明显改变了这一点。所以我会试着去解决这个问题并回复你。谢谢。 – AS91