我的数据如下

在下面的示例中,最新记录具有T,T的最后一次出现是在17年4月3日更新的,因此需要显示行

EMP     EFFDT     STATUS 
11367   15-Apr-15   A 
11367   14-Jun-15   A 
11367   10-Aug-15   T 
11367   2-Apr-17    A 
11367   3-Apr-17    T * 
11367   10-Apr-17   T 

在下面的示例中,最新记录具有T,T的最后一次出现是在18年2月23日更新的,因此需要显示行
EMP     EFFDT     STATUS 
20612   4-Sep-16    A 
20612   23-Feb-18   T * 
20612   20-Jul-18   T 

在下面的示例中,最新记录具有T,这是唯一的出现,因此将其显示
EMP    EFFDT      STATUS 
20644   12-Jul-15   A 
20644   8-Aug-16    A 
20644   6-Oct-16    T* 

在下面的示例中,最新记录没有T,因此无需显示
EMP    EFFDT      STATUS 
21155   18-May-17   T 
21155   21-Jun-17   A 
21155   13-Mar-18   T 
21155   15-Aug-18   A 

我的期望输出应为(带有*标记的记录)
EMP    EFFDT      STATUS 
11367   3-Apr-17    T 
20612   23-Feb-18   T 
20644   6-Oct-16    T 

请您参考如下方法:

这是一个孤岛和差距的问题。

在CTE中,您尝试找出哪个岛的T为最后更新(t = 0)

SQL DEMO

WITH cte as ( 
  SELECT "EMP",  
         "EFFDT",  
         SUM(CASE WHEN "STATUS" <> 'T'  
                  THEN 1  
                  ELSE 0  
             END) OVER (partition by "EMP" ORDER BY "EFFDT" DESC) as t 
  FROM Table1 
)   
SELECT "EMP", MIN("EFFDT") as "EFFDT", MAX('T') as "STATUS" 
FROM cte  
WHERE t = 0 
GROUP BY "EMP" 

输出
|   EMP |                 EFFDT | STATUS | 
|-------|-----------------------|--------| 
| 11367 | 2017-04-03 00:00:00.0 |      T | 
| 20612 | 2018-02-23 00:00:00.0 |      T | 
| 20644 | 2016-10-06 00:00:00.0 |      T | 

对于调试,您可以尝试
SELECT * 
FROM cte  

看看如何创建 t


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!