我已尝试搜索我的问题的答案,但之前涵盖的所有方案都略有不同。道歉如果我错过了一个回答此问题的人。
我有一个看起来像这样的表:
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的日期范围是从第一个表中获取日期的最小值和最大值。看起来这应该很容易,但我完全陷入困境。
谢谢,
汤姆
答案 0 :(得分:1)
您可以使用ROW_NUMBER
MIN
和MAX
来执行此操作:
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 |