سؤال

لدي استعلام محدد سيعيد شيئًا مثل الجدول التالي:

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

حيث توقف = ابدأ + ن ؛ ن = 100 في هذه الحالة.

أود دمج التداخل لكل معرف:

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

المعرف 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top