用排名合并行

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)

Demo on DB Fiddle:

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.