我尝试了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次,但在记录日期中是不连续的。
感谢 肯
答案 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