2013-07-19 137 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