sql - 减少 SQL 中的行数

标签 sql postgresql reduce

我有一个选择查询,它将返回类似于下表的内容:

start | stop | id
------------------
0     | 100  | 1
1     | 101  | 1
2     | 102  | 1
2     | 102  | 2
5     | 105  | 1
7     | 107  | 2
...
300   | 400  | 1
370   | 470  | 1
450   | 550  | 1

其中停止 = 开始 + n;在这种情况下 n = 100。

我想合并每个 id 的重叠部分:

start | stop | id
------------------
0     | 105  | 1
2     | 107  | 2
...
300   | 550  | 1

id 1 不给出 0 - 550,因为开始 300 在停止 105 之后。

第一次查询会返回几十万条记录,n可以达到几万条,处理的越快越好。

顺便说一句,使用 PostgreSQL。

最佳答案

WITH    bounds AS
        (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY start) AS rn
        FROM    (
                SELECT  id, LAG(stop) OVER (PARTITION BY id ORDER BY start) AS pstop, start
                FROM    q
                UNION ALL
                SELECT  id, MAX(stop), NULL
                FROM    q
                GROUP BY
                        id
                ) q2
        WHERE   start > pstop OR pstop IS NULL OR start IS NULL
        )
SELECT  b2.start, b1.pstop
FROM    bounds b1
JOIN    bounds b2
ON      b1.id = b2.id
        AND b1.rn = b2.rn + 1

关于sql - 减少 SQL 中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134856/

相关文章:

mysql - SQL排行榜显示

postgresql - 错误 : missing FROM-clause entry for table "new"

sql - 使用GORM和PostgreSQL查找半径10km附近的所有行

android - 将数组缩减为单个整数会导致类型错误

JavaScript:使用reduce函数的句子变体

sql - 删除 .ldf 文件后恢复数据库

sql - 从表中选择部分或全部记录的有效方法

mysql - 带有计算的sql select语句

postgresql - 引用另一个表中的行 (PostgreSQL)

apache - Apache Hive与法线贴图减少