下面是使用岛屿和空白溶液的溶液:
DECLARE @t TABLE (id INT, date DATE)
INSERT INTO @t
VALUES (2143, '20150902'),
(2143, '20150915'),
(2143, '20150916'),
(2143, '20150917'),
(2144, '20150902'),
(2144, '20150903'),
(2144, '20150916'),
(2144, '20150917');
WITH cte1
AS (SELECT id ,
date ,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) i
FROM @t
GROUP BY id ,
date
),
cte2
AS (SELECT id ,
MIN(date) mi ,
MAX(date) ma ,
ROW_NUMBER() OVER (ORDER BY (SELECT NULL
)) rn
FROM cte1
GROUP BY id ,
DATEDIFF(DAY, i, date)
)
SELECT t.* ,
ROW_NUMBER() OVER (PARTITION BY t.id, c.rn ORDER BY date)
FROM @t t
JOIN cte2 c ON t.id = c.id
AND t.date BETWEEN c.mi AND c.ma
输出:
2143 2015-09-02 1
2143 2015-09-15 1
2143 2015-09-16 2
2143 2015-09-17 3
2144 2015-09-02 1
2144 2015-09-03 2
2144 2015-09-16 1
2144 2015-09-17 2
*一般来说*,如果你在'PARTITION BY'和'都在同一列ORDER BY',你做错了什么。 –
我会讽刺的,但后来我意识到所有的答案都是很好的答案,所以谢谢:) – Nils
忽略请,错误,对不起 –