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

TSQL识别非连续序列中的第一条记录,tsql,windowing,Tsql,Windowing,我试着用1 1/2轮班来解决我的问题集,但没能达到目的。用光标在大约15分钟内解决了这个问题,而且运行速度足够快。 但我想知道是否有一种方法可以基于设置来完成 我们有从第三方HR应用程序中提取的员工状态更改记录:empid、recorddate、status。我需要确定emp状态随时间变化的记录日期和状态。然而,数据中存在一个问题。有时,emp会有不同记录日期的行,但状态不变 declare @test table (empid int, recorddate date,status varch

我试着用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的记录日期为2000年3月1日,没有返回任何记录,因为状态与2000年2月1日之前的记录日期相同;emp 1的记录日期为2000年6月1日,没有返回任何记录,因为状态值与最早记录日期的记录相比没有变化

对于emp 2,同样的概念是,没有返回该emp的7/1/2000 recorddate记录,因为最接近的早期记录状态没有改变

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'
我尝试使用partion by empid和status、order by empid、recorddate对不变的状态序列进行编号,然后从每个窗口框中选择行编号1以获得最早的出现,但没有成功。当状态可能在emp的记录中出现超过1次,但在记录日期之间不连续时,行号不会重置为1

谢谢
ken

您可以使用窗口功能轻松解决此问题:

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

我的错。应该解释一下我们使用的是Sql Server 2008 r2