在PostgreSQL中按递增列对行进行分组

时间:2018-11-07 20:51:57

标签: sql postgresql gaps-and-islands

我有下面显示的表格,只有一列。我想要实现的是将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 :(得分:1)

您可以将带有缺口的序列与没有缺口的序列进行比较:

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