說我有一張像
| 店鋪 | 日期 | 開了 |
|---|---|---|
| 灣 | 1/1/2022 | 真的 |
| 灣 | 1/2/2022 | 真的 |
| 灣 | 1/3/2022 | 真的 |
| 灣 | 1/4/2022 | 錯誤的 |
| 灣 | 1/5/2022 | 錯誤的 |
| 灣 | 1/6/2022 | 錯誤的 |
| 灣 | 1/7/2022 | 真的 |
| 灣 | 1/8/2022 | 真的 |
| 灣 | 1/9/2022 | 真的 |
| 沃爾瑪 | 1/7/2022 | 真的 |
| 沃爾瑪 | 1/8/2022 | 錯誤的 |
| 沃爾瑪 | 1/9/2022 | 真的 |
我希望他們使用 partition by 并獲得組的排名,例如
| 店鋪 | 日期 | 開了 | 團體 |
|---|---|---|---|
| 灣 | 1/1/2022 | 真的 | 1 |
| 灣 | 1/2/2022 | 真的 | 1 |
| 灣 | 1/3/2022 | 真的 | 1 |
| 灣 | 1/4/2022 | 錯誤的 | 2 |
| 灣 | 1/5/2022 | 錯誤的 | 2 |
| 灣 | 1/6/2022 | 錯誤的 | 2 |
| 灣 | 1/7/2022 | 真的 | 3 |
| 灣 | 1/8/2022 | 真的 | 3 |
| 灣 | 1/9/2022 | 真的 | 3 |
| 沃爾瑪 | 1/7/2022 | 真的 | 1 |
| 沃爾瑪 | 1/8/2022 | 錯誤的 | 2 |
| 沃爾瑪 | 1/9/2022 | 真的 | 3 |
我開始嘗試 partition by store,is_open但真的很困惑在 order by 子句中使用什么,任何幫助將不勝感激。
uj5u.com熱心網友回復:
這實際上是一個缺口和孤島問題。一種方法使用行號差異方法:
WITH cte AS (
SELECT t.*, ROW_NUMBER() OVER (PARTITION BY store ORDER BY date) rn1,
ROW_NUMBER() OVER (PARTITION BY store, is_open ORDER BY date) rn2
FROM yourTable t
),
cte2 AS (
SELECT t.*, MIN(date) OVER (PARTITION BY store, is_open, rn1 - rn2) AS min_date
FROM cte t
)
SELECT store, date, is_open,
DENSE_RANK() OVER (PARTITION BY store ORDER BY rn1 - rn2, min_date) "group"
FROM cte2
ORDER BY store, date;
請注意,我們cte2在這里使用第二個 CTE來查找每個島嶼的最小日期值。這樣做是為了區分不同is_open值(真/假)的兩個島,這些值恰好在行號上具有相同的差異。它確保在行號不同的情況下,先報告較早的島。

演示
uj5u.com熱心網友回復:
您可以使用 LAG() 來檢測組的開始。
with cte AS (
SELECT t.*, case when lag(is_open) OVER (PARTITION BY store ORDER BY date) = is_open then 0 else 1 end sflag
FROM yourTable t
)
SELECT store, date, is_open, sum(sflag) over(PARTITION BY store ORDER BY date) grp
FROM cte
ORDER BY store, date;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324405.html
上一篇:MongoDB查詢回傳計數?
