當按日期時間順序排列的 ID 之一發生變化時,我試圖重置 ROW_NUMBER() 值。例如在下表中,當 Location_ID 更改時,我想將 RowNum 重置為 1。這是我正在使用的陳述句。
[RowNum] = ROW_NUMBER() OVER (PARTITION BY EventDate, Asset_ID, Location_ID ORDER BY Scan_Timestamp)
我得到 RowNumX,但想要 RowNumY。
| 活動日期 | 掃描時間戳 | 資產_ID | 位置 ID | 行數 | 行數 |
|---|---|---|---|---|---|
| 2021 年 9 月 1 日 | 09/01/21 上午 12:28 | 30010712 | 996 | 1 | 1 |
| 2021 年 9 月 1 日 | 09/01/21 06:18 上午 | 30010712 | 30000372 | 1 | 1 |
| 2021 年 9 月 1 日 | 09/01/21 06:52 上午 | 30010712 | 30000345 | 1 | 1 |
| 2021 年 9 月 1 日 | 09/01/21 08:43 上午 | 30010712 | 996 | 2 | 1 重置(Loc_ID 已更改) |
| 2021 年 9 月 1 日 | 09/01/21 08:44 上午 | 30010712 | 996 | 3 | 2 |
| 2021 年 9 月 1 日 | 09/01/21 08:47 上午 | 30010712 | 30000402 | 1 | 1 |
| 2021 年 9 月 1 日 | 09/01/21 上午 11:17 | 30010712 | 996 | 4 | 1 重置(Loc_ID 已更改) |
| 2021 年 9 月 1 日 | 09/01/21 上午 11:17 | 30010712 | 997 | 1 | 1 |
| 2021 年 9 月 1 日 | 09/01/21 下午 01:34 | 30010712 | 997 | 2 | 2 |
| 2021 年 9 月 1 日 | 09/01/21 下午 01:47 | 30010712 | 30000402 | 2 | 1 重置(Loc_ID 已更改) |
| 2021 年 9 月 1 日 | 09/01/21 下午 01:51 | 30010712 | 997 | 3 | 1 重置(Loc_ID 已更改) |
| 2021 年 9 月 1 日 | 09/01/21 下午 01:52 | 30010712 | 997 | 4 | 2 |
我想我必須使用 CTE 加入,但希望有人可能會看到我忽略的一個明顯的簡單解決方案。
uj5u.com熱心網友回復:
這是一種間隙和孤島問題。
有很多解決方案,這里是一個:
- 使用
LAG以確定行,其中LocationID的變化 - 使用視窗計數為每個島創建分組 ID
- 然后使用這個分組ID作為磁區列計算行號
WITH Changes AS (
SELECT *,
IsChange = CASE WHEN LAG(Location_ID, 1, -999) OVER (PARTITION BY EventDate, Asset_ID
ORDER BY Scan_Timestamp) <> Location_ID THEN 1 END
FROM YourTable t
),
Groups AS (
SELECT *,
GroupId = COUNT(IsChange) OVER (PARTITION BY EventDate, Asset_ID
ORDER BY Scan_Timestamp ROWS UNBOUNDED PRECEDING)
FROM Changes
)
SELECT
EventDate,
Scan_Timestamp,
Asset_ID,
Location_ID,GroupId,IsChange,
RowNumY = ROW_NUMBER() OVER (PARTITION BY EventDate, Asset_ID, GroupId ORDER BY Scan_Timestamp)
FROM Groups;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313300.html
標籤:sql sql-server 查询语句
上一篇:在展開的欄位上連接表
下一篇:獲取某列不重復的所有行
