PL/SQL ile birden fazla kaydı tek satırda getirmek (lag over() lead over())

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

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;

Lag over()

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ç;

lag over()

Başka bir analytic functionda görüşürüz umarım…

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page
Programlama dillerinin popülarite sıralaması
pl/sql delimited list oluşturmak

Your comments

Loading Facebook Comments ...

Leave a Reply