在 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 表中查找序列的间隙的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 持久性查询语言按顺序查找间隙

在 MySQL 中查找时间序列数据间隙的方法?

Pandas 时间序列:查找会话中的间隙,并使用单独的 ID 命名每个会话/间隙

尝试使用 java 将数据插入 PostgresQL 表时,序列应用程序的权限被拒绝

在 postgresql 表中查找最大条目,sql

如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值