如何从日期列表中创建日期范围

时间:2015-08-25 23:45:44

标签: sql-server sql-server-2012

我已尝试搜索我的问题的答案,但之前涵盖的所有方案都略有不同。道歉如果我错过了一个回答此问题的人。

我有一个看起来像这样的表:

ID     Date
35  2015-06-01
35  2015-06-02
35  2015-06-03
35  2015-06-06
40  2015-06-07
40  2015-06-08
40  2015-06-09
40  2015-06-10
40  2015-06-13
35  2015-06-14
35  2015-06-15
35  2015-06-16
35  2015-06-17

我希望以下列形式获得:

ID   DateFrom      DateTo
35  2015-06-01    2015-06-07
40  2015-06-07    2015-06-14
35  2015-06-14    2015-06-18

然而,我能想到或已经看到的每个解决方案(row_number(),min / max,lag等)仅返回以下内容

ID   DateFrom      DateTo
35  2015-06-01    2015-06-18
40  2015-06-07    2015-06-14

,即ID 35的日期范围是从第一个表中获取日期的最小值和最大值。看起来这应该很容易,但我完全陷入困境。

谢谢,

汤姆

1 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER MINMAX来执行此操作:

SQL Fiddle

WITH CteGrp AS(
    SELECT *,
        grp = ROW_NUMBER() OVER(ORDER BY Date)
              - ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date)
    FROM tbl
)
SELECT 
    ID,
    DateFrom = MIN([Date]),
    DateTo = MAX([Date])
FROM CteGrp
GROUP BY ID, grp
ORDER BY DateFrom

<强> RESULT

| ID |   DateFrom |     DateTo |
|----|------------|------------|
| 35 | 2015-06-01 | 2015-06-06 |
| 40 | 2015-06-07 | 2015-06-13 |
| 35 | 2015-06-14 | 2015-06-17 |