Réduire les lignes dans SQL
-
30-09-2019 - |
Question
J'ai une requête de sélection qui renverra quelque chose comme le tableau suivant:
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
Où arrêt = start + n; n = 100 dans ce cas.
Je voudrais fusionner les chevauchements pour chaque ID:
start | stop | id ------------------ 0 | 105 | 1 2 | 107 | 2 ... 300 | 550 | 1
id 1 ne donne pas 0 -. 550 parce que le début 300 est après l'arrêt 105
Il y aura des centaines de milliers d'enregistrements renvoyés par la première requête et n peut aller jusqu'à des dizaines de milliers, donc plus vite il peut être traité mieux.
En utilisant PostgreSQL btw.
La solution
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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow