Bạn có thể sử dụng này CTE
:
;WITH CTE AS (
SELECT [Date],
ROW_NUMBER() OVER(ORDER BY [Date]) AS rn,
CASE WHEN DATEDIFF(Day, PrevDate, [Date]) IS NULL THEN 0
WHEN DATEDIFF(Day, PrevDate, [Date]) > 1 THEN 0
ELSE 1
END AS flag
FROM (
SELECT [Date], LAG([Date]) OVER (ORDER BY [Date]) AS PrevDate
FROM #Dates) d
)
để sản xuất các kết quả sau:
Date rn flag
===================
2015-01-01 1 0
2015-01-02 2 1
2015-01-03 3 1
2015-01-06 4 0
2015-01-07 5 1
2015-01-11 6 0
Tất cả bạn phải làm bây giờ là để tính toán một số hoạt động của flag
lên đến các xuất hiện đầu tiên của một trước zero giá trị:
;WITH CTE AS (
... cte statements here ...
)
SELECT [Date], b.cnt + 1
FROM CTE AS c
OUTER APPLY (
SELECT TOP 1 COALESCE(rn, 1) AS rn
FROM CTE
WHERE flag = 0 AND rn < c.rn
ORDER BY rn DESC
) a
CROSS APPLY (
SELECT COUNT(*) AS cnt
FROM CTE
WHERE c.flag <> 0 AND rn < c.rn AND rn >= a.rn
) b
OUTER APPLY
tính giá trị rn
của trước tiên cờ không có giá trị xuất hiện trước giá trị t hàng. CROSS APPLY
tính số lượng bản ghi trước bản ghi hiện tại tối đa lần xuất hiện đầu tiên của cờ có giá trị bằng không trước đó.
Nguồn
2015-01-31 09:20:24
Chuỗi không nên là '3,2,1,2,1,1' thay vì' 1,2,3,1,2,1'? Bạn đã đề cập đến sự bắt đầu, không phải là kết thúc. –
Xin lỗi, tôi kết thúc với mỗi ngày. – Mutex