按 PostgreSQL 中的递增列对行进行分组
Group rows by an incrementing column in PostgreSQL
我有下面显示的 table,只有一列。我想要实现的是将 x 中没有间隙的所有行分开,例如数字 1-3、5-6 和 8-9(因为间隙是 4 和 7)。
+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 8 |
| 9 |
+---+
我想让它看起来像这样:a table 有两列(a 和 b),表示在前一列 x 中没有间隙的范围。对于每个间隙,都会插入一条新记录。我将如何在 PostgreSQL 中处理它?
+---+---+
| a | b |
+---+---+
| 1 | 3 |
| 5 | 6 |
| 8 | 9 |
+---+---+
您可以将有间隙的序列与没有间隙的序列进行比较:
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
我有下面显示的 table,只有一列。我想要实现的是将 x 中没有间隙的所有行分开,例如数字 1-3、5-6 和 8-9(因为间隙是 4 和 7)。
+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 8 |
| 9 |
+---+
我想让它看起来像这样:a table 有两列(a 和 b),表示在前一列 x 中没有间隙的范围。对于每个间隙,都会插入一条新记录。我将如何在 PostgreSQL 中处理它?
+---+---+
| a | b |
+---+---+
| 1 | 3 |
| 5 | 6 |
| 8 | 9 |
+---+---+
您可以将有间隙的序列与没有间隙的序列进行比较:
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