2012-05-20 60 views
1

我有這樣SQL語句來找到基於

ID firSrvdate LastSrvdate 
---------------------- 
1 1-12-81 1-15-81 
1 1-18-81 1-18-81 
1 2-9-81 3-1-81 
2 4-2-81 4-5-81 
2 8-18-81 8-18-81 
2 11-9-81 11-21-81 
3 3-12-81 4-15-81 
3 7-17-81 8-19-81 

我需要找到每個IDMindateMaxdate的條件下表中的記錄組日期的差異,服務之間的差額是不到90天

所以我期待的結果是這樣的

ID Mindate MaxDate 
----------- 
1 1-12-81 3-1-81 
2 8-18-81 11-21-81 
3 7-17-81 8-19-81 
+0

我很抱歉,我是什麼無法解釋我的樓內設有商務邏輯:我需要找到每個ID的最低服務日期​​和最大的服務日期,但條件是每個服務週期之間的差距小於90天 – user1405838

+0

例如,爲什麼「ID = 3」的結果顯示爲「7-17-81,8-19-81」而不是「3-12-81,4- 15-81'而不是(或者)? –

+0

我需要檢查是否有90個服務缺口。如果服務差距超過90天,則新的第一服務日期變爲最低服務日期​​,這是id 3的情況。 – user1405838

回答

1

你可以做到這一點機智小時having子句:

select id, min(date) as mindate, max(date) as maxdate 
from table 
group by id 
having datediff(day, min(date), max(date) < 90 
+0

你在'datediff'上遺漏了一個'''',而其他列則是'MinDate'和'MaxDate',它是解決方案。 – rcdmk

+1

@rcdmk恩作爲書面它將返回一個答案這裏是一個[sqlfiddle演示](http://sqlfiddle.com/#!3/1f556/6)我的意思是 –

+0

它沒有工作得到了Id1的結果,但不是id = 2,3 as .... id \t mindate \t maxdate 1981-01-12 \t 1981-01-18 – user1405838

2

因爲我們不知道這對日期將適合在90天的窗口,我們首先需要做一個連接到自身。一旦我們有了,我們必須選擇我們想要的。使用row_Number我們可以按最大的差異來排序。我也使用maxdate作爲決勝手。這裏的intermediate result looks like

SELECT id, 
     mindate, 
     maxdate 
FROM (SELECT t1.id, 
       t1.mindate, 
       t2.maxdate, 
       Row_number() OVER (partition BY t1.ID 
            ORDER BY Datediff(day, t1.mindate, 
              t2.maxdate) DESC, t2.maxdate DESC) rn 
     FROM table1 t1 
       INNER JOIN table1 t2 
       ON t1.id = t2.id 
     WHERE Datediff(day, t1.mindate, t2.maxdate) < 90) AS t 
WHERE rn = 1 

DEMO