我有一个选择查询,它将返回类似于下表的内容:
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/