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。
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)