Sql 用秩合并行

Sql 用秩合并行,sql,group-by,amazon-redshift,gaps-and-islands,Sql,Group By,Amazon Redshift,Gaps And Islands,当前: 当RNK为1时,如图所示合并ID;否则,如果RNK为0,则保持原样 请帮忙怎么办 所需: 这是一个缺口和孤岛问题。您希望将rnk值为1的相邻行分组在一起 下面是一种使用行数和条件表达式的方法: select case when min(id) <> max(id) then concat(min(id), '-', max(id)) else min(id) end id, min(rnk) rnk from ( select t.*,

当前:

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

请帮忙怎么办

所需:


这是一个缺口和孤岛问题。您希望将rnk值为1的相邻行分组在一起

下面是一种使用行数和条件表达式的方法:

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)
:


这是一个缺口和孤岛问题。然而,当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);

是一个dbfiddle。

如果id值中有间隙怎么办?如果A101不见了。
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);