sql >> Databasteknik >  >> RDS >> Oracle

LISTAGG motsvarighet med fönsterklausul

Det enda sättet jag kan komma på för att uppnå detta är med en korrelerad underfråga:

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;

Jag inser att detta inte ger exakt det resultat du efterfrågade, men förhoppningsvis är det tillräckligt för att övervinna problemet med den kumulativa LISTAGG och få dig på väg.

Jag har konfigurerat en SQL-fiol för att demonstrera lösningen.



  1. Hur kan jag manipulera MySQL fulltext sökrelevans för att göra ett fält mer "värdefullt" än ett annat?

  2. regexp för alla karaktärer med accent i Oracle

  3. Användarrollbehörigheter för olika moduler med hjälp av bitvisa operatorer

  4. I Apache Spark 2.0.0, är ​​det möjligt att hämta en fråga från en extern databas (istället för att ta hela tabellen)?