在 PostgreSQL 表中查找序列的间隙
Posted
技术标签:
【中文标题】在 PostgreSQL 表中查找序列的间隙【英文标题】:Find gaps of a sequence in PostgreSQL tables 【发布时间】:2021-02-16 10:20:06 【问题描述】:我有一个带有字段 invoice_number 的发票表。这就是我执行 select invoice_number from invoice 时发生的情况
invoice_number |
---|
1 |
2 |
3 |
5 |
6 |
10 |
11 |
我想要一个能给出以下结果的 SQL:
gap_start | gap_end |
---|---|
1 | 3 |
5 | 6 |
10 | 11 |
【问题讨论】:
您不应该对发票编号使用序列,序列有“间隙”是正常的。 【参考方案1】:demo:db<>fiddle
您可以使用row_number()
window function 创建行数并将与实际值的差异用作分组标准:
SELECT
MIN(invoice) AS start,
MAX(invoice) AS end
FROM (
SELECT
*,
invoice - row_number() OVER (ORDER BY invoice) as group_id
FROM t
) s
GROUP BY group_id
ORDER BY start
【讨论】:
以上是关于在 PostgreSQL 表中查找序列的间隙的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 时间序列:查找会话中的间隙,并使用单独的 ID 命名每个会话/间隙