TSQL识别非连续序列中的第一条记录

时间:2016-07-21 00:44:35

标签: tsql windowing

我尝试了1 1/2班来解决我的问题集,但是不能完全实现。用光标解决了大约15分钟,运行速度足够快。 但我想知道是否有办法以套装为基础。

我们有从第三方HR应用程序中提取的员工状态更改记录:empid,recorddate,status。我需要确定每次更改emp状态的记录日期和状态。但是数据存在问题。有时,emp会有不同记录日期的行,但状态不会改变。

declare @test table (empid int, recorddate date,status varchar(10))
insert into @test (empid,recorddate,status) values
(1,'1/1/2000','a'),
(1,'2/1/2000','b'),
(1,'3/1/2000','b'),
(1,'3/3/2000','b'),
(1,'4/1/2000','c'),
(2,'2/1/2000','a'),
(2,'3/1/2000','c'),
(1,'5/1/2000','a')
(1,'6/1/2000','a')
(2,'7/1/2000','c')

我需要为emp的状态更改返回记录和状态。

因此在下面的示例中,对于emp#1,没有为3/1/2000的记录日期返回记录,因为状态与先前的记录日期2/1/2000相同,并且没有记录为emp# 1表示6/1/2000,因为状态值与最近的记录日期最近的记录没有变化。

与emp#2的概念相同,没有记录返回该emp的7/1/2000记录日期,因为状态对于最近的早期记录没有变化

empid, recorddate, status
--------------------------------------
1,'1/1/2000','a'
1/'2/1/2000','b'
1,'4/1/2000','c'
1,'5/1/2000','a'
2,'2/1/2000','a'
2,'3/1/2000','c'

我尝试使用empid和status分配不变的状态序列,按empid命令,记录日期,然后从每个窗口“frame”中选择rownumber 1以获得最早的出现,但没有运气。当状态可能发生时,rownumber将不会重置为1。一个emp的记录中有1次,但在记录日期中是不连续的。

感谢 肯

1 个答案:

答案 0 :(得分:0)

您可以使用LAG窗口函数轻松解决此问题:

select empid, recorddate, status
from (
   select empid, recorddate, status,
          coalesce(lag(status) over (partition by empid 
                                     order by recorddate), '') as prevstatus
   from @test) as t
where status <> prevstatus
order by empid, recorddate