0

2 つの潜在的な「タイプ」と、各 ID と「タイプ」に関連付けられた多くの日付を持つ多くの ID を持つテーブルがあります。タイプAより大きいID、「タイプ」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 よりも大きく、その条件を満たす 2 つの日付のうち最も近い日付です。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 に答える