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