0

SQL のテーブルから一連の日付を取得しています。日付範囲を返したいのですが、助けが必要です。

だからもし私がこのような日付を持っていたら

PK  - Date                                      
160 - 2013-04-16 12:09:00   
160 - 2013-04-17 11:07:00   
162 - 2013-04-16 12:10:00   
160 - 2013-04-20 12:10:00   

例えば欲しい

PK   - beg                   -  end
160  -  2013-04-16 12:09:00  -  2013-04-17 11:07:00
160  -  2013-04-17 11:07:00  -  2013-04-20 12:10:00
162  -  2013-04-16 12:10:00  -  2013-04-16 12:10:00

手伝ってくれませんか。

ありがとうございました

Microsoft SQL Server Management Studio 10.0.1600.22 を使用しています

4

1 に答える 1

1

MS SQL Server 2008 を使用した例を次に示します (ただし、2005 以降では機能するはずです)。

WITH CTE AS
(
  SELECT RowNum = ROW_NUMBER() OVER (PARTITION BY PK ORDER BY Date ASC), *
  FROM Dates
)
SELECT
  A.PK, A.Date [beg], COALESCE(B.Date, A.Date) [end]
FROM
  CTE A
  LEFT JOIN CTE B
    ON B.PK = A.PK AND B.RowNum = A.RowNum + 1
WHERE
  B.RowNum IS NOT NULL OR A.RowNum = 1

これにより、各 PK の行番号が取得され、テーブルとそれ自体の間の結合が提供され、その PK の最初の行でない限り、一致しない行が除外されます。

ここにテーブルがあります:

CREATE TABLE Dates (PK INT, Date DATETIME)

INSERT INTO Dates VALUES
  (160, '2013-04-16 12:09:00'),
  (160, '2013-04-17 11:07:00'),
  (162, '2013-04-16 12:10:00'),
  (160, '2013-04-20 12:10:00')

ここでSQL Fiddle (うまくいけば - 問題が発生しています)。

于 2013-05-14T17:16:55.893 に答える