0

我有一个包含许多 ID 的表,其中有两个潜在的“类型”以及与每个 ID 和“类型”相关联的许多日期。我想选择 ID、“类型”A 的最新日期和大于类型 A 的“类型”B 的最接近日期。

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 等于 max(typeA) {2/10/13 vs 2/9/13} 和 Date B {2 /15/13} 大于日期 A 和满足该条件的两个日期中最接近的日期。ID 3 仅等于大于日期 A 的 A 条目和最接近的 B 条目 {3/20/13}

我尝试了几次最小、最大和行/分区迭代,但结果留下了几个符合条件的条目。使用 Sql Server 2008 V 10。任何帮助将不胜感激

4

2 回答 2

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    ║
╚════╩═════════════════════════════════╩═════════════════════════════════╝

一个 sqlfiddle 供您尝试。

于 2013-07-19T22:04:48.353 回答
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 小提琴

于 2013-07-19T22:06:38.337 回答