You are on page 1of 16

Analitikus s egyb hasznos

fggvnyek Oracle 11g alatt







1 TARTALOMJEGYZK
1 Tartalomjegyzk ......................................................................................................... 2
2 Bevezets ................................................................................................................... 3
3 Az analitikus fggvnyekrl ltalnosan .................................................................... 3
3.1 Az ORDER BY rsz .......................................................................................................... 3
3.2 A PARTITION BY rsz ...................................................................................................... 3
3.3 Az ablak_defincis rsz ................................................................................................. 4
3.3.1 ROW tpus esetn ....................................................................................................... 4
3.3.2 RANGE tpus esetn .................................................................................................... 4
4 Analitikus fggvnyek hasznlata .............................................................................. 5
4.1 A LAG s a LEAD fggvnyek ......................................................................................... 5
4.1.1 Plda a LAG s a LEAD fggvnyek hasznlatra ........................................................ 5
4.2 A ROW_NUMBER, RANK s DENSE_RANK fggvnyek ................................................. 6
4.2.1 Plda a ROW_NOMBER, RANK s DENSE_RANK fggvnyek hasznlatra ............... 6
4.2.2 Futtatsi tervek a DENSE_RANK hasznlata esetn ................................................... 7
4.3 A FIRST_VALUE s a LAST_VALUE fggvnyek .............................................................. 9
4.3.1 Plda a FIRST_VALUE hasznlatra ............................................................................ 9
4.4 A KEEP FIRST s a KEEP LAST kulcsszavak ..................................................................... 9
4.4.1 Plda a KEEP FIRST hasznlatra .............................................................................. 10
4.5 A ratio_to_report fggvny ......................................................................................... 10
4.5.1 Plda a ratio_to_report fggvny hasznlatra ....................................................... 10
4.6 A NTILE fggvny ......................................................................................................... 11
4.6.1 Plda az NTILE fggvny hasznlatra ...................................................................... 11
4.7 A PARTITION BY zradk az aggregcis fggvnyek utn ........................................ 11
4.7.1 Plda a PARTITION BY zradk hasznlatra ............................................................ 12
4.8 Plda a ROW tpus ablakdefinci hasznlatra........................................................ 12
4.9 Plda a RANGE tpus ablakdefinci hasznlatra .................................................... 13
5 Egyb hasznos fggvnyek ........................................................................................13
5.1 A LISTAGG fggvny .................................................................................................... 14
5.1.1 Plda a LISTAGG fggvny hasznlatra ................................................................... 14
5.2 A WIDTH_BUCKET fggvny ........................................................................................ 14
5.2.1 Plda a WIDTH_BUCKET fggvny hasznlatra ...................................................... 15
6 Konklzi ..................................................................................................................15
7 Irodalomjegyzk ........................................................................................................16



2 BEVEZETS
Napjaink informatikai krnyezete lehetv teszi az informcik nagy mennyisg
trolst, s az ezekben trtn gyors keresst. Erre alapozva egyre nagyobb
szerepet jtszanak a dnts tmogat rendszerek az let minden terletn. A
vezetk egyre nagyobb mrtkben tmaszkodnak az vek sorn felhalmozdott
adatok elemzsbl szrmaz informcikra. Az adatok elemzse tbbnyire
erforrs ignyes mvelet, ezrt a relcis adatbzis kezel rendszerek klnbz
eszkzkkel tmogatjk a nagy mennyisg adatok analzist.
Jelen dokumentum az Oracle 11g ltal nyjtott nhny eszkzt s azok hasznlatt
taglalja pldkon keresztl. Ezen eszkzk nagy rszt a szaknyelv analitikus
fggvnyeknek nevezi.
3 AZ ANALITIKUS FGGVNYEKRL LTALNOSAN
Az analitikus fggvnyek ltalnos formja a kvetkez:

Fggvny_nv(arg1,..., argn) OVER ( [PARTITION BY <...>] [ORDER BY <....>] [<ablak_definci>] )

Az analitikus fggvnyek kirtkelse az sszes join s a where gon felsorolt
felttelek kirtkelse utn trtnik meg.
A formula az alkalmazni kvnt fggvny nevvel s annak paramtereivel kezddik.
A tovbbiakban rszletezni fogom a formula egyes rszeit, majd pldkon keresztl
megnzzk azok hasznlatt.
3.1 Az ORDER BY rsz
Egy partcin bell a rekordok sorrendjt az order by rsz segtsgvel tudjuk
befolysolni. Egyes fggvnyek (pl.: Lead, Lag, Rank, stb.) kimenett befolysolja a
rekordok partcin belli sorrendje, msokt nem (pl. Sum, Avg, Min, stb.)
Az order by rsz ltalnos formja a kvetkez:

ORDER BY <sql_kif> [ASC|DESC] NULLS [FIRST|LAST]

Az [ASC | DESC] rsszel tudjuk befolysolni, hogy a halmaz rendezettsge nvekv
vagy cskken legyen.
A NULLS [FIRST | LAST] rsszel pedig azt mondjuk meg, hogy a rendezettsg
szerint a null rtkek a halmaz elejre vagy vgre kerljenek.
3.2 A PARTITION BY rsz
A partition by hasznlatval az eredmny halmaza csoportosthat, mely csoportokon
aggregcik hajthatk vgre. Jogosan merl fel a krds, hogy akkor mi a klnbsg
a partition by zradkkal elltott analitikus fggvny s egy group by zradkkal
elltott lekrdezs kztt.


A legfontosabb klnbsg taln az, hogy mg a group by zradkkal elltott
lekrdezs select gn nem szerepelhet olyan oszlop definci, amely nem szerepel
a group by gon, addig az analitikus fggvnyeknl nincs ilyen megkts, viszont az
aggregci ugyan gy elvgezhet. Azaz az analitikus fggvnyek gy vgzik el a
csoportostst s rajtuk az aggregcit, hogy a megjelen eredmnyhalmaz
tnylegesen nem lesz csoportostva.
3.3 Az ablak_defincis rsz
Nhny analitikus fggvny tmogatja az ablak_definci hasznlatt, melynek
segtsgvel tovbb szkthetjk a partcin belli rekordok szmt, oly mdon, hogy
a partcin bell meghatrozzuk az ablak kezdett s a vgt. Ezeket a hatrokat az
aktulis sorhoz kpest relatvan tudjuk megadni. Ktfle ablaktpus ltezik, a ROW s
a RANGE.
Az ablak definci ltalnos szintaxisa a kvetkez:

[ ROW | RANGE ] BETWEEN <kezdpont_kif> AND <vgpont_kif>

ahol a <kezdpont_kif> a kvetkezkppen nzhet ki:
(UNBOUNDED PRECEDING | CURRENT ROW | <sql_kif> [PRECEDING | FOLLOWING] )

ahol a <vgpont_kif> a kvetkezkppen nzhet ki:
(UNBOUNDED FOLLOWING | CURRENT ROW | <sql_kif> [PRECEDING | FOLLOWING] )
3.3.1 ROW tpus esetn
Az UNBOUNDED PECEDING jelentse az aktulis sort megelz partcin belli
els sor. Ennek analgijra az UNBOUNDED FOLLOWING az aktulis sort kvet
partcin belli utols sort fogja jelenteni.
A CURRENT ROW az aktulis sort jelenti.
Az <sql_kif> PRECEDING az aktulis sort <sql_kif>-el megelz sort, az <sql_kif>
FOLLOWING pedig az aktulis sort kvet <sql_kif>-dik sort jelenti, ahol az <sql_kif>
rtknek pozitv egsznek kell lenni.
A kezdpontnak mindig kisebbnek kell lenni a vgpontnl.
3.3.2 RANGE tpus esetn
A RANGE tpus esetn a szintaxis ugyan az mint a ROW tpus esetn, csupn
rtelmezsbeli klnbsg van, valamit tovbbi megktsek, melyek a kvetkezk.
Az order by zradk csak egy kifejezst tartalmazhat.
A <kezdpont_kif> s a <vgpont_kif>-ben szerepl <sql_kif> tpusnak
gymond kompatibilisek kell lenni az order by zradkban szerepl kifejezs
tpusval. Ez azt jelenti, hogy ha a kifejezs tpusa number, akkor az order by
kifejezsnek number vagy date tpusnak kell lenni. Ha a kifejezs egy
intervallum tpus, akkor az order by kifejezsnek date tpusnak kell lenni.



A RANGE tpus rtelmezsben a kezd s a vgpont nem ms, mint az order by
ltal meghatrozott oszlop aktulis rtknek a kifejezssel trtn eltolsa.
4 ANALITIKUS FGGVNYEK HASZNLATA
4.1 A LAG s a LEAD fggvnyek
A LAG s a LEAD fggvnyek segtsgvel egy halmaz brmely sorn llva elkrhetjk
egy az ltalunk definilt rendezsi relci szerinti az adott sort x-el megelz (Lag) illetve
kvet (Lead) sor egy oszlopnak rtkt.

LEAD (<sql_kifejezs>, <eltols>, <alaprtelmezett_rtk>)
OVER ([PARTITION BY <...>] [ORDER BY <....>])
LAG (<sql_kifejezs>, <eltols>, <alaprtelmezett_rtk>)
OVER ([PARTITION BY <...>] [ORDER BY <....>])

Mindkt fggvnynek 3 paramtere van:
sql kifejezs: Egy szabvnyos sql kifejezs, mely ki lesz rtkelve a megelz
vagy a kvetkez soron.
eltols: Egy egsz szm, mely megmondja hny sorral megelz illetve kvet
soron rtkeldjn ki az els paramter.
alaprtelmezett rtk: Egy alaprtelmezett rtk mely akkor kerl visszaadsra,
ha a kirtkelt kifejezs eredmnye null.
4.1.1 Plda a LAG s a LEAD fggvnyek hasznlatra
Tegyk fel, hogy szksgnk van a dolgozk nevnek s fizetsnek listjra abc
sorrendben gy, hogy minden sorba oda kell rnunk azt is, hogy az elz s a
kvetkez sorban mennyi volt a fizets. Amennyiben nincs megelz vagy kvetkez
sor gy 0-t rjunk a megfelel helyre. Ez a problma a kvetkezkppen oldhat meg.

SELECT dolg.nv "Nv",
dolg.fizets "Fizets",
LAG(dolg.fizets,1,0) OVER (ORDER BY dolg.nv) "Elz sor fizetse",
LEAD(dolg.fizets,1,0) OVER (ORDER BY dolg.nv) "Kvetkez sor fizetse"
FROM aa dolg;

A lekrdezs eredmnye a kvetkez:



4.2 A ROW_NUMBER, RANK s DENSE_RANK fggvnyek
A fggvnyek szintaxisa a kvetkez:
ROW_NUMBER () OVER ([PARTITION BY <...>] [ORDER BY <....>])
RANK () OVER ([PARTITION BY <...>] [ORDER BY <....>])
DENSE_RANK () OVER ([PARTITION BY <...>] [ORDER BY <....>])

Az emltett fggvnyek mindegyike egy sorszmot ad az eredmny halmaz minden egyes
sornak egy rendezsi relcit alapul vve. A rendezsi relcit a mr fentebb emltett
order by zradk segtsgvel tudjuk definilni. Az eltrs a sorszmok kiosztsba van,
melyet a kvetkez szably hatroz meg.

ROW_NUMBER() : A row_number esetn a sorszmok szigoran monoton
nvekv sort alkotnak, ahol az N. elem a halmazban az N. sorszmot kapja.
RANK() : A rank esetn a sorszmok monoton nvekv sort alkotnak. Abban az
esetben klnbzik a row_number-tl, ha a rendezsi relci szerint a halmaz
tartalmaz azonos sorokat. Ilyen esetben, ha az N. s az N+1. elem a rendezsi
relci szerint egyenl, akkor az N. s az N+1. elem is N. sorszmot kapja,
azonban a rendezsi relci szerinti kvetkez N+2. eltr elem az N+2.
sorszmot kapja.
DENSE_RANK() : A dense_rank esetn a sorszmok monoton nvekv sort
alkotnak. Ez is abban az esetben klnbzik a row_number-tl, ha a rendezsi
relci szerint a halmaz tartalmaz azonos sorokat. Abban klnbzik a rank
fggvnytl, hogy itt a rendezsi relci szerinti kvetkez N+2. eltr elem az
N+1. sorszmot kapja.
4.2.1 Plda a ROW_NOMBER, RANK s DENSE_RANK fggvnyek
hasznlatra
A hrom fggvny segtsgvel rangsoroljuk a dolgozkat, a fizetsk szerinti
rendezettsgk alapjn.

SELECT row_number() OVER(ORDER BY dolg.fizets) row_number,
rank() OVER(ORDER BY dolg.fizets) rank,
dense_rank() OVER(ORDER BY dolg.fizets) dense_rank,
dolg.nv,
dolg.fizets
FROM aa dolg;

A lekrdezs eredmnye a kvetkez:




Amennyiben ugyan ezt a rangsorolst a telephelyen bell szeretnnk megtenni, gy
hasznlnunk kell a partition by zradkot.

SELECT row_number() OVER(PARTITION BY dolg.telep ORDER BY dolg.fizets) row_number,
rank() OVER(PARTITION BY dolg.telep ORDER BY dolg.fizets) rank,
dense_rank() OVER(PARTITION BY dolg.telep ORDER BY dolg.fizets) dense_rank,
dolg.nv,
dolg.fizets,
dolg.telep
FROM aa dolg;

Ezesetben az eredmny a kvetkez:

4.2.2 Futtatsi tervek a DENSE_RANK hasznlata esetn
A dense_rank fggvny jl hasznlhat a kvetkez problma megoldshoz. Adjuk
vissza azokat a szolgltatsokat, amelyeket azon a napon rgztettek, amikor az utols
rgzts trtnt. Az ltalnos megolds a kvetkezkppen nz ki.

SELECT ID
FROM service s1
WHERE TRUNC(s1.rec_time) = (SELECT MAX(TRUNC(s2.rec_time))
FROM service s2);

Ha megnzzk a vgrehajtsi tervet, jl ltszik, ami a lekrdezsbl vrhat, hogy a
service tbla ktszer is vgig lesz olvasva teljesen. Egyszer, mikor kivlasztjuk a
maximumt a rgztsi idknek, majd mg egyszer mikor kivlasztjuk a maximum alapjn
az aznapi rgztseket.



Nzzk hogyan oldhat meg ez a problma a DENSE_RANK hasznlatval.

SELECT ID
FROM (SELECT ID,
DENSE_RANK() OVER(ORDER BY TRUNC(s.rec_time) DESC NULLS LAST) rnk
FROM service s)
WHERE rnk = 1;

Ha most is megnzzk a vgrehajtsi tervet ltjuk, hogy eltnt az egyik TABLE ACCESS
FULL sor.

Termszetesen a table access full egy index elhelyezsvel elkerlhet, azonban a
hangsly az egyszeri vgrehajtson van, hisz a lekrdezs nem mindig ilyen egyszer,
hiszen a service tbla helyett hasznlhatnnk akr egy nzetet is ami 10 tbla
sszekapcsolsbl ll el. Ebben az esetben mr nem mindegy hogy hnyszor olvassuk
vgig a tblt.
A fentebbi pld kiprbltam egy 3 470 680 sort tartalmaz tbln. A rec_time oszlopon
nem volt index.
A futsi id az els megolds esetn 10,657 sec.
A futsi id a msodik megolds esetn 8,938 sec.


4.3 A FIRST_VALUE s a LAST_VALUE fggvnyek
A first_value s a last_value fggvnyek a kpzett csoport meghatrozott sorrendjnek
els illetve utols rekordjnak megfogsra szolgl.
Szintaxisa a kvetkez:
FIRST_VALUE(<sql_kifejezs>) OVER ([PARTITION BY <...>] [ORDER BY <....>[<ablak_definci>]])
LAST_VALUE(<sql_kifejezs>) OVER ([PARTITION BY <...>] [ORDER BY <....>[<ablak_definci>]])
4.3.1 Plda a FIRST_VALUE hasznlatra
Adott a kvetkez problma. rassuk ki telephelyenknt a dolgozk fizetsnek a
telephely legkisebb fizetstl val eltrst.

SELECT t.nv "Nv",
t.telep "Telephely",
t.fizets "Fizets",
t.first_v "Legkisebb fiz.",
t.fizets - t.first_v "Eltrs"
FROM (
SELECT dolg.nv,
dolg.telep,
dolg.fizets,
first_value(dolg.fizets) OVER(PARTITION BY dolg.telep ORDER BY dolg.fizets) first_v
FROM aa dolg )t;

Az eredmnyhalmaz a kvetkezkppen nz ki:

4.4 A KEEP FIRST s a KEEP LAST kulcsszavak
Ezen kt analitikus fggvny elg specilis s valsznleg hasznlatuk sem lesz tl
gyakori, azonban szksg esetn rengeteg fradtsgtl megkmlheti a programozt. A
fggvnyek szintaxisa is eltr az ltalnos formtl.
A szintaxis a kvetkez:

Fggvnynv() KEEP (DENSE_RANK FIRST ORDER BY <sql_kif>) OVER ([PARTITION BY <...>])
Fggvnynv() KEEP (DENSE_RANK LAST ORDER BY <sql_kif>) OVER ([PARTITION BY <...>])

Lthat, hogy az order by zradk kikerlt az over() rszbl s tkerlt a FIRST vagy a
LAST kulcssz utn. Az over() rsz csupn a partition by zradkot tartalmazza. A
DENSE_RANK pedig jelen esetben egy kulcssz nem a mr elzekben trgyalt
fggvny, mg sem vletlen a hasonlsg.


A fggvny a kvetkezkppen mkdik. A partition by zradk ltal meghatrozott
csoportot rangsorolja a dense_rank-nl lert szablyok alapjn, majd a rangsorols
szerinti els (FIRST esetn) vagy utols (LAST esetn) rangsorba es rekordokon
vgrehajtja az aggregl fggvnyt.
4.4.1 Plda a KEEP FIRST hasznlatra
Adott a kvetkez problma. rassuk ki minden dolgozhoz a telephelyn dolgoz
legalacsonyabb szint dolgozk tlagfizetst.

SELECT dolg.nv,
dolg.telep,
dolg.szint,
dolg.fizets,
AVG(dolg.fizets) KEEP (DENSE_RANK FIRST ORDER BY dolg.szint)
OVER (PARTITION BY dolg.telep) Avg_fiz_szint
FROM aa dolg
ORDER BY dolg.telep, dolg.szint

A lekrdezs eredmnye a kvetkezkppen nz ki:

4.5 A ratio_to_report fggvny
A fggvny szintaxisa a kvetkez:
RATIO_TO_REPORT(<sql_kifejezs>) OVER ([PARTITION BY <...>])

A ratio_to_report fggvny egy halmaz minden elemre megmondja, hogy azok hny
szzalka a halmaz elemeinek sszegnek. A halmaz mrett a partition by
zradkkal tudjuk szablyozni, a halmaz rtkeit pedig paramterl kapja a fggvny.
A fggvny nem tmogatja az order by zradkot s az ablak defincit sem.
4.5.1 Plda a ratio_to_report fggvny hasznlatra

SELECT d.*,
ratio_to_report(d.a2) over (partition by d.a1) as ratio_to_report
FROM test d

A lekrdezs eredmnye a kvetkez:



4.6 A NTILE fggvny
A fggvny szintaxisa a kvetkez:

NTILE(kosarak szma) OVER ([PARTITION BY <...>] ORDER BY<>)

Az NTILE fggvny a rendezettsget alapul vve a partci elemeit a paramtereknt
kapott szm kosrba osztja szt. Amennyiben a partcin bell a sorok szma nem
tbbszrse a kosarak szmnak, gy mindig az alacsonyabb sorszm kosarak
kerlnek elszr feltltsre.
4.6.1 Plda az NTILE fggvny hasznlatra
A plda a dolgozkat osztja szt telephelyenknt 3 kosrba, a dolgozk nevnek
sorrendje alapjn.

SELECT dolg.nv "Nv",
dolg.telep "Telephely",
NTILE(3) OVER (PARTITION BY dolg.telep ORDER BY dolg.nv) "Kosr"
FROM aa dolg

A lekrdezs eredmnye a kvetkez:

Az eredmnyben lthat, hogy a Debreceni partciban az egyes kosrban kerlt az
osztst kveten kimaradt egy elem.
4.7 A PARTITION BY zradk az aggregcis fggvnyek utn
Brmelyik csoportost fggvny utn hasznlhatjuk a partition by zradkot. A partition
by segtsgvel a csoportost fggvnynket vgrehajthatjuk a csoportosts egy
rszcsoportjn.
A partition by szintaxisa a kvetkez:



{SUM | AVG | MAX | MIN | COUNT | ... } OVER ( [PARTITION BY sql_kif1[,...]] )
4.7.1 Plda a PARTITION BY zradk hasznlatra
Adott a kvetkez feladat. Hatrozzuk meg, hogy a beosztsok ssz fizetse mennyivel
tr el az ugyan azon telephelyen tallhat legmagasabb sszfizetssel rendelkez
beosztstl.

SELECT t.beoszts "Beoszts",
t.telep "Telephely",
t.sfiz "ssz. fizu",
t.msfiz "Tel. beosz. max fizu",
t.msfiz - t.sfiz "Eltrs"
FROM (SELECT dolg.beoszts,
dolg.telep,
sum(dolg.fizets) sfiz,
MAX(SUM(dolg.fizets)) OVER (PARTITION BY dolg.telep) msfiz
FROM aa dolg
GROUP BY dolg.beoszts, dolg.telep
ORDER BY dolg.telep) t

A lekrdezs eredmnye a kvetkez:

4.8 Plda a ROW tpus ablakdefinci hasznlatra
Nzznk nhny pldt arra, hogy a mit kapunk eredmnyl az egyes esetekben, ha
a telephelyet vlasztjuk partcinak s a fizets a sorrend. Sajnos a plda nem tl
letszer, de a cl az egyszersgen s a kvethetsgen volt.

SELECT dolg.nv "Nv",
dolg.telep "Telephely",
dolg.fizets "Fizets",
COUNT(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets
ROWS BETWEEN 3 PRECEDING
AND 1 FOLLOWING) "Elz 3 - Kv 1",
COUNT(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) "Elz - Aktulis",
COUNT(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets
ROWS BETWEEN 3 PRECEDING
AND 1 PRECEDING) "Elz 2 - Elz 1",
COUNT(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets


ROWS BETWEEN 1 FOLLOWING
AND 3 FOLLOWING) "Elz 1 - Kv 3"
FROM aa dolg
ORDER BY dolg.telep, dolg.fizets

A lekrdezs eredmnye a kvetkez:

4.9 Plda a RANGE tpus ablakdefinci hasznlatra
Ez a plda mr egy kicsit letszerbb. Hatrozzuk meg, hogy telephelyenknt az
egyes dolgozk esetn, hny olyan dolgoz van, ahol a dolgoz fizetsnek tdvel
tbbet vagy kevesebbet keresnek.

SELECT dolg.nv "Nv",
dolg.telep "Telephely",
dolg.fizets "Fizets",
Count(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets
RANGE BETWEEN UNBOUNDED PRECEDING
AND (dolg.fizets/5) PRECEDING) "Kevesebb az tdvel",
COUNT(*) OVER (PARTITION BY dolg.telep ORDER BY dolg.fizets
RANGE BETWEEN (dolg.fizets/5) FOLLOWING
AND UNBOUNDED FOLLOWING) "Tbb az tdvel"
FROM aa dolg

A lekrdezs eredmnye a kvetkez:

5 EGYB HASZNOS FGGVNYEK
Az analitikus fggvnyeken tl az Oracle biztost mg tbb hasznos fggvnyt,
melyek rangsorolnak vagy csoportostsi mveletekhez kapcsoldnak. Nzznk ezek
kzl is egy kettt.


5.1 A LISTAGG fggvny
A fggvny szintaxis a kvetkez:
LISTAGG(sql_kif,elvlaszt_kar) WITHIN GROUP (ORDER BY<>) [OVER (PARTITION BY <...>)]

A Listagg fggvny ugyan nem egy hagyomnyos rtelemben vett analitikus
fggvny, azonban hasznlata nagyban hasonlt azokra s emellett sokszor nagyon
hasznos.
Mint mr fentebb emltettem, alap esetben egy group by zradkkal rendelkez
lekrdezs select gn nem szerepelhet aggregcis fggvny nlkl olyan oszlop, amely
nem szerepel a group by zradkban. A listagg fggvny tulajdonkppen ezt oldja fel gy,
hogy a paramtereknt kapott oszlop csoportban szerepl rtkeit egy elvlaszt
karaktersorozatot hasznlva sszefzi.
Kt paramtere van:
sql_kifejezs: ez egy olyan oszlopdefinci, amely nem szerepel a group by
zradkban.
elvlaszt karaktersorozat: ezzel a karaktersorozattal lesz elvlasztva a csoport
minden eleme az sszefzs sorn.
A fggvnyt a WITHIN GROUP kulcsszavak kvetik, majd zrjelben egy rendezsi
relcit kell megadni, mely szerint az oszlop rtkei rendezve lesznek a felsorolson
bell.
5.1.1 Plda a LISTAGG fggvny hasznlatra
SELECT dolg.fizets "Fizets",
listagg(dolg.nv,', ') WITHIN GROUP (ORDER BY dolg.nv) "Nevek"
FROM aa dolg
GROUP BY dolg.fizets;

A lekrdezs eredmnye a kvetkez:


5.2 A WIDTH_BUCKET fggvny
A fggvny szintaxisa a kvetkez:
WIDTH_BUCKET(sql_kif, als_hatr, fels_hatr, zskok_szma)

A WIDTH_BUCKET egy hisztogramm fggvny, megy egy kirtkelt kifejezs rtkeit
sztosztja egy egyenl rszekre felosztott intervallumon.
Ngy paramtere van:
kifejezs: Ez a kifejezs adja az rtket melyet az intervallumon el kell helyezni.


als hatr: Az intervallum kezdete.
fels hatr: Az intervallum vge.
zskok szma: Hny rszre osszuk fel az intervallumot.
Az els hrom paramter lehet numerikus s dtum tpus. Ms tpus nem megengedett.
Az utols paramternek egy pozitv egsz szmnak kell lenni.Ezek utn az als s fels
hatr kz es intervallumot felosztjuk a zskok szmval. Ha az intervallumunk 1 -
20000 kz esik s a zskok szma 4, akkor a feloszts a kvetkezkppen fog kinzni.

Ez alapjn lesz az els paramterknt megadott kifejezs elhelyezve valamelyik zskba.
Az intervallum [0,5000) halmazokra van felosztva. Az brn ltszik, hogy van egy 0-s s
egy 5-s zsk is. rtelemszeren a 0-s zskba kerlnek azok az rtkek, melyek
kisebbek az intervallum als hatrnl s az 5-s zskba kerlnek azok az rtkek,
melyek nagyobbak az intervallum fels hatrnl.
5.2.1 Plda a WIDTH_BUCKET fggvny hasznlatra
Tegyk fel, hogy a dolgozinkat szeretnnk beosztani 4 csoportba a fizetsk szerint s
tudjuk, hogy a legalacsonyabb fizets 60 000 Ft a legmagasabb pedig 130 000 Ft.

SELECT dolg.nv "Nv",
dolg.fizets "Fizets",
WIDTH_BUCKET(dolg.fizets,60000,130000,4) "Csoport"
FROM aa dolg;
A lekrdezs eredmnye a kvetkez:


A pldbl ltszik, hogy a balrl zrt jobbrl nylt halmaz miatt Attila mr fellcsordul s az
5-s zskba kerl.

6 KONKLZI
Br a pldatbla kicsi volt, a knnyebb rthetsg kedvrt, azrt rzkelhet, hogy
bonyolultabb problmk is egyszeren lekezelhetk az analitikus fggvnyek
segtsgvel. Ha csak a LAG vagy a LEAD fggvnyre gondolunk, a lekrdezs


aktulis sorban egy elz sor valamelyik rtkre hivatkozni anlkl hogy
valamilyen egyszer szabllyal meg tudnnk hatrozni az elz sor elsdleges
kulcst, nem egy trivilis problma. Tovbb a vgrehajtsi tervet vizsglva lthat,
hogy az oracle minimalizlja az ehhez szksges erforrsokat s egy
vgigolvasssal hatrozza meg az rtkeket.
Az oracle eszkztrban vannak mg egyb analitikus fggvnyek (pl. lineris
regresszin alapul fggvnyek), melyek esetenknt bonyolult problmk megoldst
teszik lehetv hatkony mdon.

7 IRODALOMJEGYZK
1. Oracle Tuning - The Definitive Reference Second Edition (http://rampant-
books.com/book_1002_oracle_tuning_definitive_reference_2nd_ed.htm)
2. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.
htm#sthref964

You might also like