2016-02-11 67 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