可以使用ROW_NUMBER()
通过FindingId
和秩序由UpdateDate
递减分区,挑选第一个和最后日期,在该日期DIFF天:
设置:
-- drop table UpdatedEstimatedRemediationDate
create table UpdatedEstimatedRemediationDate
(
FindingId INT,
UpdateDate DATE
)
insert into UpdatedEstimatedRemediationDate values
(1, '2015-06-15'), (1, '2015-12-30'), (1, '2016-06-30'), (2, '2015-07-13'), (2, '2016-05-01')
GO
查询:
;WITH Cte AS (
SELECT FindingId, UpdateDate, ROW_NUMBER() OVER (PARTITION BY FindingId ORDER BY UpdateDate DESC) AS RowNo
FROM UpdatedEstimatedRemediationDate
)
SELECT LU1.FindingId, DATEDIFF(day, LU1.UpdateDate, LU2.UpdateDate) AS DaysDiff
FROM Cte LU1
JOIN Cte LU2 ON LU2.FindingId = LU1.FindingId AND LU1.RowNo = 2 AND LU2.RowNo = 1
[没有自我加入版]
对于SQL Server 2012
,SELF JOIN
可使用LAG/LEAD
功能避免:
WITH CTE AS (
SELECT FindingId, DATEDIFF(day, UpdateDate, LEAD(UpdateDate, 1, NULL) OVER (PARTITION BY FindingId ORDER BY UpdateDate)) DayDiff,
ROW_NUMBER() OVER (PARTITION BY FindingId ORDER BY UpdateDate DESC) RowNo
FROM UpdatedEstimatedRemediationDate)
SELECT CTE.FindingId, CTE.DayDiff
FROM CTE
WHERE RowNo = 2
非常感谢你@Alexei。 – Shannon