按行合并行

问题描述 投票:2回答:2

当前:

“当前”

[当RNK为1时,如所示合并ID,否则,如果RNK为0,则保持原样。

请帮助该怎么做。

必填:

“必需”

sql group-by amazon-redshift gaps-and-islands
2个回答
1
投票

这是一个孤岛问题。但是,您实际上只在rnk = 1时才关心孤岛。因此,一种方便的计算方法是rnk = 0的累加和。然后剩下的就是聚合并组合id:

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 <>小提琴。


1
投票

这是一个孤岛问题。您要将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 | nk:-------- | -:A100-A102 | 1个A103 | 0A104 | 0A105-A106 | 1个
© www.soinside.com 2019 - 2024. All rights reserved.