用排名合并行
Consolidate Rows with rank
当前:
当 RNK 为 1 时,如所示合并 ID,否则如果 RNK 为 0,则保持原样。
请帮忙怎么做。
必填:
这是一个缺口和孤岛问题。您想要将 rnk
的值为 1
.
的相邻行组合在一起
这是一种使用 row_number()
和条件表达式的方法:
select
case when min(id) <> max(id) then concat(min(id), '-', max(id)) else min(id) end id,
min(rnk) rnk
from (
select
t.*,
row_number() over(order by id) rn1,
row_number() over(partition by rnk order by id) rn2
from mytable t
) t
group by case when rnk = 1 then rn1 - rn2 else rn1 + rn2 end
order by min(id)
id | rnk
:-------- | --:
A100-A102 | 1
A103 | 0
A104 | 0
A105-A106 | 1
这是一个缺口和孤岛问题。但是,您实际上只在 rnk = 1
时才关心这些岛屿。因此,计算它们的一种简便方法是 rnk = 0
的累加和。然后剩下的就是聚合和合并ids:
select (case when min(id) = max(id) then min(id)
else min(id) || '-' || max(id)
end) as id,
rnk
from (select t.*, sum(1 - rnk) over (order by id) as grp
from t
) t
group by grp, rnk
order by min(id);
Here 是一个 db<>fiddle.
当前:
当 RNK 为 1 时,如所示合并 ID,否则如果 RNK 为 0,则保持原样。
请帮忙怎么做。
必填:
这是一个缺口和孤岛问题。您想要将 rnk
的值为 1
.
这是一种使用 row_number()
和条件表达式的方法:
select
case when min(id) <> max(id) then concat(min(id), '-', max(id)) else min(id) end id,
min(rnk) rnk
from (
select
t.*,
row_number() over(order by id) rn1,
row_number() over(partition by rnk order by id) rn2
from mytable t
) t
group by case when rnk = 1 then rn1 - rn2 else rn1 + rn2 end
order by min(id)
id | rnk :-------- | --: A100-A102 | 1 A103 | 0 A104 | 0 A105-A106 | 1
这是一个缺口和孤岛问题。但是,您实际上只在 rnk = 1
时才关心这些岛屿。因此,计算它们的一种简便方法是 rnk = 0
的累加和。然后剩下的就是聚合和合并ids:
select (case when min(id) = max(id) then min(id)
else min(id) || '-' || max(id)
end) as id,
rnk
from (select t.*, sum(1 - rnk) over (order by id) as grp
from t
) t
group by grp, rnk
order by min(id);
Here 是一个 db<>fiddle.