如何獲得最長連續相同值的行?
表Learning:
| 行ID | 價值觀 |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
| 6 | 1 |
| 7 | 0 |
| 8 | 1 |
| 9 | 1 |
| 10 | 1 |
最長的連續值為 1(rowID8-10 因為rowID1-2 是 2 而rowID6-6 是 1)。如何查詢以獲取連續值的實際行(不僅僅是rowStart和 rowEnd值),例如:
| 行ID | 價值觀 |
|---|---|
| 8 | 1 |
| 9 | 1 |
| 10 | 1 |
對于1 和 0的最長連續值?
DB小提琴
uj5u.com熱心網友回復:
我認為最簡單的方法是使用視窗計數來定義島嶼。那么為了得到“最長”的島嶼,我們只需要聚合、排序和限制:
select min(valueid) grp_start, max(valueid) grp_end
from (select t.*, sum(value = 0) over(order by valueid) grp from testing t) t
where value = 1
group by grp
order by count(*) desc limit 1
在您提供的 DB Fiddle中,查詢回傳:
| grp_start | grp_end |
|---|---|
| 8 | 10 |
uj5u.com熱心網友回復:
這是一個間隙和孤島問題,一種方法是使用行數差異法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY rowID) rn1,
ROW_NUMBER() OVER (PARTITION BY values ORDER BY rowID) rn2
FROM yourTable
),
cte2 AS (
SELECT *,
MIN(rowID) OVER (PARTITION BY values, rn1 - rn2) AS minRowID,
MAX(rowID) OVER (PARTITION BY values, rn1 - rn2) AS maxRowID
FROM cte1
),
cte3 AS (
SELECT *, RANK() OVER (PARTITION BY values ORDER BY maxRowID - minRowID DESC) rnk
FROM cte2
)
SELECT rowID, values
FROM cte3
WHERE rnk = 1
ORDER BY values, rowID;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533334.html
