Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Effizienter Join mit einer korrelierten Unterabfrage

Versuchen Sie Folgendes:

SELECT  rt.rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty
FROM    (
    SELECT  *
    FROM    (
        SELECT  r.*, t.*, SUM(doUse) OVER (PARTITION BY rangeId ORDER BY aDate) AS span
        FROM    (
            SELECT  r.rangeId, startDate, MAX(day) AS dm
            FROM    Range r, Days d
            WHERE   d.rangeid = r.rangeid
            GROUP BY
                r.rangeId, startDate
            ) r, Dates t
        WHERE   t.adate >= startDate
        ORDER BY
            rangeId, t.adate
        )
    WHERE
        span <= dm
    ) rt, Days d
WHERE   d.rangeId = rt.rangeID
    AND d.day = GREATEST(rt.span, 1)

P. S. Es scheint mir, dass der einzige Punkt ist, all diese Dates einzuhalten in der Datenbank ist ein fortlaufender Kalender mit gekennzeichneten Feiertagen zu erhalten.

Sie können in Oracle mit folgender Konstruktion einen Kalender beliebiger Länge generieren:

SELECT :startDate + ROWNUM
FROM   dual
CONNECT BY
       1 = 1
WHERE  rownum < :length

und behalte nur Feiertage in Dates . Ein einfacher Beitritt zeigt Ihnen, welche Dates Feiertage sind und welche nicht.