2013-07-19 133 views
0

我有一個表與許多ID與兩個潛在的「類型」和許多日期與每個ID和「類型」相關聯。我想選擇的ID,最新的日期爲「類型」 A和「類型」 B最接近的日期比A型Sql Server返回最大日期和日期最接近和大於最大日期

Sample Table   
ID Type Date 
1 A 1/5/2013 
1 A 1/10/2013 
1 B 1/1/2013 
2 A 2/10/2013 
2 A 2/9/2013 
2 B 2/15/2013 
2 B 2/20/2013 
3 A 3/15/2013 
3 B 3/10/2013 
3 B 3/20/2013 

所需的結果

ID Date A Date B 
2 2/10/2013 2/15/2013 
3 3/15/2013 3/20/2013 

ID 1留更大因爲它不滿足條件B> Max(typeA){1/10/13} ID 2等於最大(typeA){2/10/13 vs 2/9/13}並且日期B {2/15/13}大於日期A以及符合該條件的兩個日期中最接近的日期。 ID 3等於只有A條目和最接近乙條目{13年3月20日}比日期更大甲

我已經嘗試了幾種最小值,最大值,和行/分區迭代但結果都不放過幾個合格的條目。使用SQL Server 2008 V 10.任何幫助將大大理解

回答

4

假設的SQL Server 2005 +,你可以使用這個:

;WITH CTE AS 
(
    SELECT [ID], 
      [Type], 
      [Date], 
      RN = ROW_NUMBER() OVER(PARTITION BY [ID] ORDER BY [Date] DESC) 
    FROM YourTable 
    WHERE [Type] = 'A' 
) 
SELECT A.[ID], 
     A.[Date] [Date A], 
     B.[Date] [Date B] 
FROM (SELECT * 
     FROM CTE 
     WHERE RN = 1) A 
CROSS APPLY (SELECT TOP 1 [Date] 
      FROM YourTable 
      WHERE [Type] = 'B' 
      AND [ID] = A.[ID] 
      AND [Date] > A.[Date] 
      ORDER BY [Date]) B 

的結果是:

╔════╦═════════════════════════════════╦═════════════════════════════════╗ 
║ ID ║    DATE A    ║    DATE B    ║ 
╠════╬═════════════════════════════════╬═════════════════════════════════╣ 
║ 2 ║ February, 10 2013 00:00:00+0000 ║ February, 15 2013 00:00:00+0000 ║ 
║ 3 ║ March, 15 2013 00:00:00+0000 ║ March, 20 2013 00:00:00+0000 ║ 
╚════╩═════════════════════════════════╩═════════════════════════════════╝ 

而且here is的sqlfiddle爲你嘗試。

0

你可以使用:

SELECT ID, A_Date, B_Date 
FROM (
    SELECT a.ID,a.Date 'A_Date', b.Date 'B_Date', ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY DATEDIFF(day,a.Date,b.Date))'RowRank' 
    FROM (SELECT ID,Type, MAX(Date)'Date' 
      FROM Table1 
      WHERE Type = 'A' 
      GROUP BY ID,Type 
     )a 
    JOIN Table1 b 
     ON a.ID = b.ID 
     AND a.Type <> b.Type 
     AND a.Date < b.Date 
)sub 
WHERE RowRank = 1 

演示:SQL Fiddle