sql >> Databáze >  >> RDS >> Oracle

Ekvivalent LISTAGG s klauzulí okénka

Jediný způsob, jak toho dosáhnout, je pomocí korelovaného poddotazu:

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;

Uvědomuji si, že to nedává přesný výstup, který jste požadovali, ale doufejme, že to stačí k překonání problému kumulativního LISTAGG a dostanete se na cestu.

Nastavil jsem SQL Fiddle demonstrovat řešení.



  1. Přidání vícesloupcového primárního klíče do tabulky se 40 miliony záznamů

  2. NHibernate se po přesunu na hostitele se sdíleným serverem se spuštěným mysql vloží, ale neaktualizuje

  3. Jak vytvořit tabulku v MySQL

  4. Jak mohu vložit více řádků do oracle s hodnotou sekvence?