【发布时间】:2019-12-13 08:52:36
【问题描述】:
我想从日志表中获取前 5 条记录,其中“批准日期”已更改为 NULL,反之亦然。日期值无关紧要,但顺序很重要。
ApprovedDate ChangeDate changeByUser
NULL 2019-12-09 06:40:15.437 vaisakh
NULL 2019-12-09 06:42:31.563 vaisakh
NULL 2019-12-09 06:42:33.140 vaisakh
NULL 2019-12-09 07:03:54.660 vaisakh
2019-12-09 07:05:29.800 2019-12-09 07:05:29.817 vaisakh
2019-12-09 07:05:29.800 2019-12-09 07:05:38.707 vaisakh
NULL 2019-12-09 07:09:33.160 vaisakh
NULL 2019-12-09 07:09:42.440 vaisakh
NULL 2019-12-09 09:38:19.757 vaisakh
2019-12-09 09:41:42.977 2019-12-09 09:41:43.243 Raveendran
在这种情况下,我想要第一条记录和第 5 条记录(有人批准了数据,这就是为什么一个值),然后第 7 条记录值是 null 有人拒绝了它。
我尝试使用递归 CTE,它可以工作,但对于大型记录,性能问题很大
DECLARE @today DATETIME = GETDATE();
with RESULT (CIPApprovedDate,ChangeDate,changeByUser,legalId,depth)AS(
SELECT TOP 1 CIPApprovedDate, ChangeDate, changeByUser, legalId,1
FROM LegalEntityExtensionLog
WHERE legalId= 2688518
ORDER BY ChangeDate ASC
union ALL
select
L.CIPApprovedDate, L.ChangeDate, L.changeByUser, L.legalId,ct.depth+1
FROM LegalEntityExtensionLog L INNER JOIN Result CT
on L.legalId=CT.legalId AND L.changeDate>CT.changeDate
AND ISNULL(L.CIPApprovedDate,@today) <> ISNULL(CT.CIPApprovedDate,@today)
)select * from Log where ChangeDate in(select MIN(ChangeDate) from Result group by depth)
【问题讨论】:
-
您的示例数据似乎缺少(至少)列
LegalId。 -
我忘了在示例数据中添加它。我无法编辑问题。 LegalID 是恒定的。在这里你可以把它当作整行的 22222。
标签: sql sql-server tsql window-functions gaps-and-islands