【问题标题】:Find gaps of a sequence in PostgreSQL tables在 PostgreSQL 表中查找序列的间隙
【发布时间】: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

【问题讨论】:

  • 您不应该对发票编号使用序列,序列有“间隙”是正常的。

标签: sql postgresql gaps-and-islands


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多