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