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

LISTAGG-Äquivalent mit Windowing-Klausel

Die einzige Möglichkeit, die ich mir vorstellen kann, um dies zu erreichen, ist eine korrelierte Unterabfrage:

WITH CTE AS
(   SELECT  TranID, 
            TranLine, 
            ItemID, 
            OrderID, 
            Dollars, 
            Quantity, 
            SUM(dollars) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumDollar, 
            SUM(Quantity) OVER (PARTITION BY TranID, ItemID, OrderID ORDER BY TranLine) AS CumQuantity
    FROM    T
)
SELECT  TranID, 
        TranLine, 
        ItemID, 
        OrderID, 
        Dollars, 
        Quantity, 
        CumDollar, 
        CumQuantity, 
        (   SELECT  LISTAGG(Tranline, ';') WITHIN GROUP(ORDER BY CumQuantity)
            FROM    CTE T2
            WHERE   T1.CumQuantity >= T2.CumQuantity
            AND     T1.ItemID = T2.ItemID
            AND     T1.OrderID = T2.OrderID
            AND     T1.TranID = T2.TranID
            GROUP BY tranid, itemid, orderid
        ) AS ListAgg
FROM    CTE T1;

Mir ist klar, dass dies nicht die genaue Ausgabe liefert, nach der Sie gefragt haben, aber hoffentlich reicht es aus, um das Problem der kumulativen LISTAGG zu lösen und Sie auf den richtigen Weg zu bringen.

Ich habe eine SQL Fiddle eingerichtet um die Lösung zu demonstrieren.