sql >> Base de Datos >  >> RDS >> Oracle

Unión eficiente con una subconsulta correlacionada

Prueba esto:

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. D. Me parece que el único punto para mantener todas estas Dates en la base de datos es obtener un calendario continuo con los días festivos marcados.

Puede generar un calendario de longitud arbitraria en Oracle utilizando la siguiente construcción:

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

y mantener solo días festivos en Dates . Una simple unión le mostrará qué Dates son festivos y cuáles no.