我尝试了 1 1/2 班次来解决我的问题集,但不能完全做到。用光标在大约 15 分钟内解决了它,它运行得足够快。但我想知道是否有办法做到基于集合。
我们有从 3rd 方 HR 应用程序中提取的员工状态变化记录:empid、recorddate、status。我需要确定 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 的任何状态更改,我都需要返回记录和状态。
因此,在下面的示例中,没有返回记录日期为 3/1/2000 的 emp #1 的记录,因为状态与之前的记录日期 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 和状态的分区、按 empid 排序、记录日期对不变的状态序列进行编号,然后从每个窗口“帧”中选择行号 1 以获得最早的出现,但没有运气。当状态可能在 emp 的记录中出现 > 1 次时,行号不会重置为 1,但在记录日期之间不连续。
谢谢肯