Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Sql Server返回最大日期和最接近或大于最大日期的日期_Sql Server_Tsql_Date - Fatal编程技术网

Sql server Sql Server返回最大日期和最接近或大于最大日期的日期

Sql server Sql Server返回最大日期和最接近或大于最大日期的日期,sql-server,tsql,date,Sql Server,Tsql,Date,我有一个表,其中有许多ID和两种可能的类型,以及与每个ID和类型关联的许多日期。我想选择ID、类型A的最新日期以及类型B大于类型A的最近日期 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

我有一个表,其中有许多ID和两种可能的类型,以及与每个ID和类型关联的许多日期。我想选择ID、类型A的最新日期以及类型B大于类型A的最近日期

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
ID1被禁用,因为它不满足条件B>MaxtypeA{1/10/13} ID2等于maxtypeA{2/10/13 vs 2/9/13},日期B{2/15/13}大于日期A以及满足该条件的两个日期中最近的一个。 ID3只等于一个条目和比日期A大的最近的B条目{3/20/13}


我尝试了几个min、max和row/partition迭代,但结果遗漏了几个符合条件的条目。使用SQLServer2008V10。如果您有任何帮助,我们将不胜感激

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

和一个SQLFIDLE供您尝试。

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

您可以使用:

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
演示:

您可以使用:

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
演示: