Oracle
 sql >> база данни >  >> RDS >> Oracle

LISTAGG еквивалент с прозоречна клауза

Единственият начин, за който се сещам да постигна това, е с корелирана подзаявка:

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;

Осъзнавам, че това не дава точния изход, който искахте, но се надяваме, че е достатъчно, за да преодолеете проблема с кумулативния LISTAGG и да ви тръгне по пътя.

Настроих SQL Fiddle за да демонстрирате решението.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете средната стойност на id за един месец

  2. Как да преместите файл от една директория в друга с помощта на PL SQL

  3. Мога ли да използвам аналитична функция на Oracle тук?

  4. SQL заявка за свиване на дублиращи се стойности по период от време

  5. IO грешка:Получих минус едно от повикване за четене