减少 SQL 中的行数

Fli*_*irs 3 sql postgresql reduce

我有一个选择查询,它将返回如下表所示的内容:

开始 | 停止| ID
------------------
0 | 100 | 100 1
1 | 101 | 101 1
2 | 102 | 102 1
2 | 102 | 102 2
5 | 105 | 105 1
7 | 107 | 107 2
...
300 | 300 400 | 1
370 | 370 470 | 470 1
450 | 450 550 | 550 1

其中停止=开始+n;在本例中 n = 100。

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

开始 | 停止| ID
------------------
0 | 105 | 105 1
2 | 107 | 107 2
...
300 | 300 550 | 550 1

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

第一次查询将返回数十万条记录,n 最多可达数万条,因此处理速度越快越好。

顺便说一句,使用 PostgreSQL。

Qua*_*noi 5

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
Run Code Online (Sandbox Code Playgroud)