有必要獲取日期期間。輸入資料:
login date_start date_end code
'user1', '2022-02-09', '2022-02-09' DO
'user1', '2022-02-10', '2022-02-10' DO
'user1', '2022-02-11', '2022-02-11' DO
'user1', '2022-03-28', '2022-03-28' OT
'user1', '2022-03-29', '2022-03-29' OT
'user1', '2022-03-30', '2022-03-30' OT
'user1', '2022-03-31', '2022-03-31' OT
'user1', '2022-04-01', '2022-04-01' OT
'user1', '2022-04-04', '2022-04-04' DO
預期結果:
login date_start date_end
user1 2022-02-09 2022-02-11
user1 2022-03-28 2022-04-01
user1 2022-04-04 2022-04-04
uj5u.com熱心網友回復:
這是一個空白和孤島問題。我們可以在這里使用的一個技巧是創建一個偽組,該組跟蹤每個記錄所屬的連續日期島。
WITH cte AS (
SELECT *, CASE WHEN LAG(date_start, 1, date_start) OVER
(PARTITION BY login ORDER BY date_start) =
DATEADD(day, -1, date_start)
THEN 0 ELSE 1 END AS cnt
FROM yourTable
),
cte2 AS (
SELECT *, SUM(cnt) OVER (PARTITION BY login ORDER BY date_start) AS grp
FROM cte
)
SELECT login, MIN(date_start) AS date_start, MAX(date_end) AS date_end
FROM cte2
GROUP BY login, grp
ORDER BY MIN(date_start);
演示
在上面的第一個 CTE 中,只要前一個日期不比當前日期早一天,別名就會被cnt賦值為 1 。然后,我們可以對該列求和并獲得形成連續范圍的日期組。
uj5u.com熱心網友回復:
像這樣
select max(date_end) date_end , min(date_start) date_start, login from table group by login, code
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/491695.html
