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 here(希望 - 有问题)。

于 2013-05-14T17:16:55.893 回答