SQL按ITEM ID分组计算最近两次更新日期天数差仅保留最新行
你可以在现有逻辑基础上新增分组排序窗口函数,过滤出每组最新的一条记录即可,具体实现如下:
实现思路
你已经通过LAG窗口函数计算出了每条记录和同组上一条记录的更新天数差,只需要给每个ITEM ID分组内的所有记录按更新时间倒序排序,取排序第一的记录就是每组的最新行,此时该行对应的天数差刚好就是最新更新日期和倒数第二次更新日期的差值。
最终SQL代码
WITH ranked_data AS ( SELECT [Item_ID] ,[Item] ,[Last_Updated] ,[Reason] ,DATEDIFF(day, LAG([Last_Updated], 1) OVER(PARTITION BY [Item_ID] ORDER BY [Last_Updated] ASC), [Last_Updated]) AS DAY_DIFF -- 给同ID分组内的记录按更新时间倒序编号,最新的记录编号为1 ,ROW_NUMBER() OVER(PARTITION BY [Item_ID] ORDER BY [Last_Updated] DESC) AS rn FROM [Table] ) SELECT Item_ID AS [ITEM ID], Item AS [ITEM], Last_Updated AS [LAST UPDATED], Reason AS [REASON], DAY_DIFF AS [Days Diff Since Last Correction] FROM ranked_data WHERE rn = 1
补充说明
如果某组只有一条更新记录,DAY_DIFF会返回NULL,如果你需要给这类情况设置默认值(比如0),可以用ISNULL(DAY_DIFF, 0)替换查询字段里的DAY_DIFF即可。
如果同组存在多条更新时间完全相同的最新记录,你想全部保留的话,把ROW_NUMBER替换成RANK即可。
内容的提问来源于stack exchange,提问作者Mystical Me
相关产品推荐
相关产品推荐

