PL/SQL ile birden fazla kaydı tek satırda getirmek (lag over() lead over())
Başlığı bir türlü bulamadım.. Neyse yazıyı okursanız ne demek istediğim anlaşılır sanırım ( :
Birkaç analitik fonksiyon yazmak istiyorum bloga bu yazıda onlardan biri. Basit bir senaryo düşünelim şöyle bir tablonuz var;
Burada time_id ye baktığımızda farklı time_id ye sahip kayıtlar var ve biz bunları
önceki satış – kayıtlı satış tarihi – sonraki satış
şeklinde görmek istiyoruz diyelim. Tabi uzun uzun sorgu yazabiliriz bu bilgiyi bulmak için ama maksat Oraclenin analytic funtionlarından olan lag ve lead ile yapmak ( :
Tabloyu oluşturalım;
CREATE TABLE SALES
(
PROD_ID NUMBER NOT NULL,
CUST_ID NUMBER NOT NULL,
TIME_ID DATE NOT NULL,
CHANNEL_ID NUMBER NOT NULL,
PROMO_ID NUMBER NOT NULL,
QUANTITY_SOLD NUMBER(10,2) NOT NULL,
AMOUNT_SOLD NUMBER(10,2) NOT NULL
)
Örnek kayıtlar girelim;
INSERT INTO SALES (PROD_ID,
CUST_ID,
TIME_ID,
CHANNEL_ID,
PROMO_ID,
QUANTITY_SOLD,
AMOUNT_SOLD)
VALUES (13,
2865,
TO_DATE (’01/10/1998 00:00:00′, ‘MM/DD/YYYY HH24:MI:SS’),
3,
999,
1,
1232.16);INSERT INTO SALES (PROD_ID,
CUST_ID,
TIME_ID,
CHANNEL_ID,
PROMO_ID,
QUANTITY_SOLD,
AMOUNT_SOLD)
VALUES (19,
2865,
TO_DATE (’01/14/1998 00:00:00′, ‘MM/DD/YYYY HH24:MI:SS’),
3,
999,
1,
62.15);INSERT INTO SALES (PROD_ID,
CUST_ID,
TIME_ID,
CHANNEL_ID,
PROMO_ID,
QUANTITY_SOLD,
AMOUNT_SOLD)
VALUES (20,
2865,
TO_DATE (’03/07/1998 00:00:00′, ‘MM/DD/YYYY HH24:MI:SS’),
3,
999,
1,
602.09);INSERT INTO SALES (PROD_ID,
CUST_ID,
TIME_ID,
CHANNEL_ID,
PROMO_ID,
QUANTITY_SOLD,
AMOUNT_SOLD)
VALUES (116,
2865,
TO_DATE (’02/09/1998 00:00:00′, ‘MM/DD/YYYY HH24:MI:SS’),
3,
999,
1,
14.39);COMMIT;
Şimdide sorgumuzu yazıp sonuca bakalım;
SELECT cust_id,
time_id,
LAG (amount_sold)
OVER (PARTITION BY cust_id ORDER BY cust_id, time_id)
AS previous_sold,
amount_sold,
LEAD (amount_sold)
OVER (PARTITION BY cust_id ORDER BY cust_id, time_id)
AS next_sold
FROM sales
ORDER BY cust_id, time_id
Sonuç;
Başka bir analytic functionda görüşürüz umarım…