Postgres: поиск диапазона с автоинкрементом - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующая таблица: table1

begin | value | end
---------------------
  1   |   3   | 10
  1   |   5   | 10
  1   |   2   | 10
  1   |   7   | 10
 11   |   19  | 20
 11   |   16  | 20
 11   |  14   | 20

Я ищу следующий вывод:

begin | value | end | case
-----------------------------
  1   |   3   | 10  |  1
  1   |   5   | 10  |  1
  1   |   2   | 10  |  1
  1   |   7   | 10  |  1
 11   |  19   | 20  |  2
 11   |  16   | 20  |  2
 11   |  14   | 20  |  2

Я хочу назначить уникальный номер для чисел, попадающих в определенный диапазон но я не могу найти способ обойти это. Есть предложения?

1 Ответ

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

Хммм. Это проблема разрыва и островов. Вы можете определить, где начинаются острова, проверив, нет ли других рядов, перекрывающихся с ними. Для этого вы можете использовать совокупный максимум.

Это сблизит вас:

select t.*,
       count(*) filter where (prev_end < start) over (order by start) as grp
from (select t.*,
             max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
      from t
     ) t;

Однако связи в данных означают, что в них есть пробелы. Итак, еще один уровень:

select t.*, dense_rank() over (order by grp) as sequential_grp
from (select t.*,
             count(*) filter (where prev_end < start) over (order by start) as grp   
      from (select t.*,
                   max(end) over (order by start range between unbounded preceding and 1 preceding) as prev_end
            from t
           ) t
     ) t;

Здесь - это скрипта db <> - с измененными именами столбцов, потому что такие имена, как begin и end, равны SQL ключевые слова и, следовательно, плохая идея для имен столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...