Oracle
 sql >> Base de données >  >> RDS >> Oracle

Équivalent LISTAGG avec clause de fenêtrage

La seule façon à laquelle je peux penser pour y parvenir est d'utiliser une sous-requête corrélée :

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;

Je me rends compte que cela ne donne pas la sortie exacte que vous demandiez, mais j'espère que c'est suffisant pour surmonter le problème du LISTAGG cumulatif et vous mettre sur la bonne voie.

J'ai configuré un SQL Fiddle pour démontrer la solution.