2016-02-11 66 views
1

我需要将最大日期减去上一个以前的状态日期,并且不能算出来。我将使用FindingID和UpdatedEstimatedRemediationDate。SQL-试图从同一列中减去日期值

例如:

FindingID 'FND-5645' 已经更新3次:

UpdatedEstimatedRemediationDate 
-------------------------------- 
NULL 
2015-06-15 
2015-12-30 
2016-06-30 

我需要从12,2015月获得2016年6月30日,天差。我正在使用SQL Server 2008 R2。提前致谢。

回答

1

可以使用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 2012SELF 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 
+0

非常感谢你@Alexei。 – Shannon

4

如果我理解正确的,这基本上是一个集合的查询与datediff()

select findingid, datediff(day, min(UpdatedEstimatedRemediationDate), max(UpdatedEstimatedRemediationDate) 
from t 
group by findingid; 
+0

感谢戈登·利诺夫,但给我的绝对最小值和最大值之间的天数,当我需要计算最近2次最新更新日期时。所以,我需要我的结果显示183天,因为它应该计算12-30-15(而不是MIN)和06-30-16 – Shannon