Oracle'da LISTAGG
işlevi, OVER (PARTITION BY column..)
yan tümcesiyle analitik olarak kullanmamı sağlar. Ancak, ROWS
veya RANGE
anahtar sözcükleriyle pencere kullanımını desteklemez.LISTAGG eşdeğeri pencere eşiği ile
Bir mağaza kaydında bir veri kümem var (soru için basitleştirilmiş). Kayıt tablosunun miktarının her zaman 1 - bir kalem, bir işlem satırı olduğunu unutmayın.
TranID TranLine ItemId OrderID Dollars Quantity
------ -------- ------ ------- ------- --------
1 101 23845 23 2.99 1
1 102 23845 23 2.99 1
1 103 23845 23 2.99 1
1 104 23845 23 2.99 1
1 105 23845 23 2.99 1
Ben ürün miktarına göre gruplandırılmış bir özel sipariş sisteminde bir tabloya bu verileri "eşleşmesi" gerekir. Sistemin birden fazla satırda aynı öğe kimliğine sahip olabileceğini unutmayın (sipariş edilen öğeler, öğe aynı olsa bile farklı olabilir). Ben bu verileri eşleşebilir
ItemId OrderID Order Line Dollars Quantity
------ ------- ---------- ------- --------
23845 23 1 8.97 3
23845 23 2 5.98 2
sadece yolu sipariş kimliği, öğe kimliği ve dolar tutarı gereğidir.
Esasen aşağıdaki sonuca ulaşmam gerekiyor.
ItemId OrderID Order Line Dollars Quantity Tran ID Tran Lines
------ ------- ---------- ------- -------- ------- ----------
23845 23 1 8.97 3 1 101;102;103
23845 23 2 5.98 2 1 104;105
tran hatları herhangi bir şekilde sıralanır eğer özellikle Umurumda olan, umurumda değil dolar tutarları maç ve ben "yeniden kullanım" bilgi işlem kaydından bir çizgi yapmak Özel siparişte toplam. Tabloya ayrılan tran çizgilerine ihtiyacım yok - bu raporlama amaçlıdır ve taneciklik asla kayıt işlem hattı seviyesine geri dönmez.
İlk düşüncem, sipariş sistemindeki dolar tutarı ve miktarı ile eşleşen ilk satır kümesini tanımlamak için "en iyi eşleşme" yapmak için analitik işlevlerle bunu yapabilmem gerekti. :
( ) Ama sonra benim sorguya LISTAGG eklemeyi deneyin:SELECT tranid, tranline, itemid, orderid, dollars, quantity,
SUM(dollars) OVER (partition by tranid, itemid, orderid order by tranline) cumdollar,
SUM(quantity) OVER (partition by tranid, itemid, orderid order by tranline) cumqty
LISTAGG (tranline) within group (order by tranid, itemid, orderid, tranline) OVER (partition by tranid, itemid, orderid)
FROM table
Tabii hep yerine birikimli AGG tam agg döndürdüğünü keşfetmek:
TranID TranLine ItemId OrderID Dollars Quantity CumDollar CumQty ListAgg
------ -------- ------ ------- ------- -------- -------- ------ -------
1 101 23845 23 2.99 1 2.99 1 101;102;103;104;105
1 102 23845 23 2.99 1 5.98 2 101;102;103;104;105
1 103 23845 23 2.99 1 8.97 3 101;102;103;104;105
1 104 23845 23 2.99 1 11.96 4 101;102;103;104;105
1 105 23845 23 2.99 1 14.95 5 101;102;103;104;105
Yani bu kullanışlı değildir.
Mümkünse bunu SQL'de yapmayı tercih ederim. Bunu imleçler & prosedürel mantık ile yapabileceğimin farkındayım.
LISTAGG analitik işlevi veya bunu destekleyen başka bir analitik işlevle pencereleme yapmanın bir yolu var mı?
11gR2'deyim. Bunu başarmak için aklınıza gelebilecek
+1. – DCookie