Объединить строки с рангом - PullRequest
2 голосов
/ 23 апреля 2020

Ток:

Current

Когда RNK равен 1, объедините идентификатор, как показано в другом случае, если RNK равен 0, затем оставьте его как есть.

Пожалуйста помогите как сделать.

Обязательно:

Required

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Это проблема пробелов и островков. Тем не менее, вы действительно заботитесь об островах только тогда, когда rnk = 1. Таким образом, удобным способом их расчета является совокупная сумма rnk = 0. Тогда остальное - агрегация и объединение идентификаторов:

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

Здесь - это скрипта db <>.

1 голос
/ 23 апреля 2020

Это проблема пробелов и островов. Вы хотите сгруппировать смежные строки, где 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)

Демонстрация по БД Fiddle :

id        | rnk
:-------- | --:
A100-A102 |   1
A103      |   0
A104      |   0
A105-A106 |   1
...