Группировать строки по возрастающему столбцу в PostgreSQL - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть таблица, показанная ниже, только с одним столбцом. Чего я хочу добиться, так это разделить все строки, в которых нет пробелов по x, например, номера 1-3, 5-6 и 8-9 (потому что пропуски равны 4 и 7).

+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 8 |
| 9 |
+---+

Я бы хотел, чтобы это выглядело так: таблица с двумя столбцами (a и b), указывающая диапазоны, в которых нет пробелов в предыдущем столбце x. Для каждого пробела вставляется новая запись. Как мне поступить об этом в PostgreSQL?

+---+---+
| a | b |
+---+---+
| 1 | 3 |
| 5 | 6 |
| 8 | 9 |
+---+---+

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете сравнить последовательность с пропусками с последовательностью без пропусков:

select min(x), max(x)
from
 (
   select x, 
      x-row_number() over (order by x) as dummy
   from tab
 ) as dt
group by dummy

  x | row_number | x - row_number 
| 1 |   1        |   0             -- same value for consecutive values without gaps
| 2 |   2        |   0
| 3 |   3        |   0
| 5 |   4        |   1
| 6 |   5        |   1
| 8 |   6        |   2
| 9 |   7        |   2
...