【问题标题】:Sql Server Return Max date and Date Nearest to and Greater than Max DateSql Server 返回最大日期和最接近并大于最大日期的日期
【发布时间】:2013-07-20 10:01:01
【问题描述】:

我有一个包含许多 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} 并且日期 B {2/15/13} 大于日期 A 并且是满足该条件的两个日期中最接近的日期。 ID 3 仅等于大于日期 A 的 A 条目和最接近的 B 条目 {3/20/13}

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

【问题讨论】:

    标签: sql-server tsql date


    【解决方案1】:

    假设 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 供你尝试。

    【讨论】:

      【解决方案2】:

      你可以使用:

      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

      【讨论】:

        猜你喜欢
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多