在 SQL Server 2014 中,我有下表跟蹤用戶活動:
| 用戶身份 | 事件 | 活動日期 |
|---|---|---|
| 15552221111 | 登錄 | 2022-06-01 |
| 15552221111 | 完全的 | 2022-06-08 |
| 15552221111 | 登錄 | 2022-09-01 |
| 15552221111 | 關閉 | 2022-09-11 |
| 15552222222 | 登錄 | 2022-04-01 |
| 15552222222 | 加工 | 2022-04-08 |
| 15552222222 | 加工 | 2022-06-10 |
| 15552222222 | 完全的 | 2022-06-11 |
| 15552222222 | 登錄 | 2022-09-08 |
我需要創建某種排序值,以便所有事件發生時間少于 60 天的記錄共享相同的編號。期望的結果:
| 用戶身份 | 事件 | 活動日期 | 序列 |
|---|---|---|---|
| 15552221111 | 登錄 | 2022-06-01 | 1 |
| 15552221111 | 完全的 | 2022-06-08 | 1 |
| 15552221111 | 登錄 | 2022-09-01 | 2 |
| 15552221111 | 關閉 | 2022-09-11 | 2 |
| 15552222222 | 登錄 | 2022-04-01 | 1 |
| 15552222222 | 加工 | 2022-04-08 | 1 |
| 15552222222 | 加工 | 2022-06-10 | 2 |
| 15552222222 | 完全的 | 2022-06-11 | 2 |
| 15552222222 | 登錄 | 2022-09-08 | 3 |
完全卡住了,有什么想法嗎?
下面是一些測驗代碼:
WITH testTable (USERID, EVENT, EVENT_DATE) AS
(
SELECT 15552221111, 'LOGIN', '2022-06-01' UNION ALL
SELECT 15552221111, 'COMPLETE', '2022-06-01' UNION ALL
SELECT 15552221111, 'LOGIN', '2022-09-01' UNION ALL
SELECT 15552221111, 'SHUTDOWN', '2022-09-11' UNION ALL
SELECT 15552222222, 'LOGIN', '2022-04-01' UNION ALL
SELECT 15552222222, 'PROCESSING', '2022-04-08 ' UNION ALL
SELECT 15552222222, 'PROCESSING', '2022-06-10' UNION ALL
SELECT 15552222222, 'COMPLETE', '2022-06-11' UNION ALL
SELECT 15552222222, 'LOGIN', '2022-09-08'
)
SELECT
USERID
, EVENT
, EVENT_DATE
, LEAD (EVENT_DATE, 1, 0) OVER (PARTITION BY USERID ORDER BY EVENT_DATE) NEXT_DATE
, ROW_NUMBER() OVER (PARTITION BY USERID ORDER BY EVENT_DATE) RECORD_SEQ
FROM testTable
uj5u.com熱心網友回復:
與前一行相比,我會用它LAG()來確定EVENT_DATE超過 60 天的行。然后執行累積SUM() OVER (..)以獲得SEQ您想要的
CTE AS
(
SELECT
USERID
, EVENT
, EVENT_DATE
, CASE WHEN DATEDIFF(DAY
, LAG (EVENT_DATE, 1) OVER (PARTITION BY USERID ORDER BY EVENT_DATE)
, EVENT_DATE) > 60
THEN 1
ELSE 0
END AS S
FROM testTable
)
SELECT *, SUM(S) OVER (PARTITION BY USERID ORDER BY EVENT_DATE) 1 AS SEQ
FROM CTE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507049.html
標籤:sql服务器 tsql 通过...分组 分区 差距和岛屿
上一篇:如何在一行中獲得總計和小計?
