ADATBÁZISOK http://users.nik.uni-obuda.hu/szabozs/ 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
ISMÉTLÉS 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
SELECT Záradékok sorrendje INTO FROM WHERE GROUP BY HAVING UNION/MINUS INTERSECT ORDER BY 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
ANALITIKUS és RANGFÜGGVÉNYEK 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Alapvető problémák Függvény csak a szelekciós listában lehet Sorba rendezés vagy csoportosítás utáni műveleteket csak allekérdezéssel lehet elvégezni A ROWNUM pszeudo-oszlop használata nehézkes és nem szabványosítható Megoldás: speciális függvények, amely a csoportosítással / rendezéssel együtt tudnak működni 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Analitikus függvények? analitikus_függvény OVER (analitikus_záradék) Analitikus záradék: csoportosítás (PARTITION BY), sorrendberakás (ORDER BY), ablak-kezelés (ROW/RANGE) Szabványos: SQL:2003 (OVER helyett WITHIN GROUP van egy esetben) 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Rangfüggvények Egyszerű rangfügvények: ROW_NUMBER() Egyszerű sorszám RANK() Azonos után kimarad DENSE_RANK() Azonos után folytatja PERCENT_RANK() Százalékos, [0..1] Alapvető használat: NINCS PARAMÉTERÜK! SELECT ename, sal, RANK() over (ORDER BY sal desc) as RANG FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Partition by Csoportokra bontott rang SELECT deptno, ename, sal, RANK() OVER ( PARTITION BY deptno ORDER BY sal ) as RANG FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Partition by Több mező alapján csoportokra bontott rang SELECT deptno, job, ename, sal, RANK() OVER ( PARTITION BY deptno, job ORDER BY sal ) as RANG FROM emp ORDER BY deptno, job; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
„Aggregáló” rangfüggvények? Ugyanazok a függvények, de a paraméter-lista nem üres – cél egy konkrét (a táblától független) érték sorrendjének keresése OVER helyett WITHIN GROUP NEM LEHET „PARTITION BY” 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Aggregáló használat SELECT RANK(2500) WITHIN GROUP (ORDER BY sal asc) AS rang FROM emp; SELECT RANK(:fiz) WITHIN GROUP (ORDER BY sal desc) AS rang FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Aggregáló-csoportosító használat Minden részlegben szeretnénk látni a megadott érték helyét SELECT deptno, RANK(2500) WITHIN GROUP (ORDER BY sal desc) AS rang FROM emp GROUP BY deptno; GROUP BY csoportosító függvény is használható lenne, bár logikailag sok értelme itt nincsen 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
CSOPORTOSÍTÓ FÜGGVÉNY ANALITIKUS ZÁRADÉKKAL 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csoportosító függvény analitikus zázadékkal SELECT ename, sal, SUM(SAL) OVER (order by sal) as OSSZ FROM emp; A lista rendezett – látszik ahogy az összeg növekszik! (azonos fizetéseknél egyszerre!) SELECT ename, sal, AVG(SAL) OVER (order by sal) as AVG FROM emp; egyre "pontosabb" átlag 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csoportosító függvény analitikus zázadékkal SELECT deptno, ename, sal, SUM(SAL) OVER ( partition by deptno order by ename ) as OSSZ, COUNT(*) OVER ( partition by deptno order by ename ) as DB FROM emp ORDER BY deptno, ename; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csoportosító függvény analitikus zázadékkal select ename, hiredate, sal from emp order by hiredate; select ename, hiredate, sal, sum(sal) over (order by hiredate) as OSSZ from emp order by hiredate; select ename, hiredate, sal, sum(sal) over (partition by to_char(hiredate, 'YYYY') order by hiredate) as OSSZ from emp order by hiredate; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
CSOPORTOSÍTÓ FÜGGVÉNY ANALITIKUS ZÁRADÉKKAL ÉS ABLAK-KEZELÉSSEL 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csúszó ablak Az ablak az aktuális sor előtt 1 sorral kezdődik és utána 2 sorral ér véget SELECT ename, sal, avg(SAL) OVER ( order by sal rows between 1 preceding and 2 following ) as AVG FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csúszó ablak Az ablak részleghatárokat is figyelembe vesz, az aktuális sor előtt 1 sorral kezdődik és utána 1 sorral ér véget SELECT deptno, ename, sal, sum(SAL) OVER ( partition by deptno order by sal rows between 1 preceding and 1 following ) as OSSZ FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Csúszó ablak Az ablak részleghatárokat is figyelembe vesz, az aktuális sor előtt végtelen sorral kezdődik és utána 1 sorral ér véget SELECT deptno, ename, sal, sum(SAL) OVER ( partition by deptno order by sal rows between unbounded preceding and 1 following ) as OSSZ FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Részhalmaz Lehetőségünk van RANGE alkalmazására – ritkább. Sorok száma helyett érték-részhalmazt definiálunk Az aktuális sorhoz képest a nagyobb fizetéssel rendelkezőket akarom megszámolni ez átírható lenne ROWS-ra SELECT deptno, ename, sal, count(*) OVER ( order by sal range between current row and unbounded following ) as DB FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Részhalmaz Az aktuális sorhoz képest +/- 500 USD SELECT deptno, ename, sal, count(*) OVER ( order by sal range between 500 preceding and 500 following ) as DB FROM emp; ez már nem oldható meg ROWS segítségével 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Részhalmaz Az aktuális sorhoz képest +/- 33,333% SELECT deptno, ename, sal, count(*) OVER ( order by sal range between sal/3 preceding and sal/3 following ) as DB FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Egyéb analitikus- és hisztogram-függvények 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Egyéb analitikus függvények FIRST_VALUE(), LAST_VALUE() csoport valamilyen sorrend szerinti első vagy utolsó eleme (nem-determinisztikus?) SELECT ename, sal, FIRST_VALUE(ename) OVER (order by sal asc) FROM emp; SELECT deptno, ename, sal, FIRST_VALUE(empno) OVER (partition by deptno order by sal asc) as FIRST_ID, FIRST_VALUE(ename) OVER (partition by deptno order by sal asc) as FIRST_NAME FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Egyéb analitikus függvények SELECT deptno, ename, sal, LAST_VALUE(empno) OVER (partition by deptno order by sal asc) as LAST_ID, LAST_VALUE(ename) OVER (partition by deptno order by sal asc) as LAST_NAME FROM emp; ??? Állandóan változó értékek? LAST_VALUE: "by default is the CURRENT ROW and UNBOUNDED PRECEDING" 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Egyéb analitikus függvények SELECT deptno, ename, sal, LAST_VALUE(empno) OVER (partition by deptno order by sal asc rows between current row and unbounded following) as LAST_ID, LAST_VALUE(ename) OVER (partition by deptno order by sal asc rows between current row and unbounded following) as LAST_NAME FROM emp; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Egyéb analitikus függvények RATIO_TO_REPORT() Részesedés az összegből SELECT ename, sal, RATIO_TO_REPORT(sal) OVER () as RAT FROM emp ORDER BY sal desc; SELECT deptno, ename, sal, RATIO_TO_REPORT(sal) OVER (partition by deptno) as RAT FROM emp ORDER BY deptno, sal desc; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Hisztogram függvények Eredetileg: az értelmezési tartományon belül az egyes értékekhez hány mérési eredmény tartozik (mérés helyett: képfeldolgozás?) Ezúttal: Nem pontos egyezést, hanem intervallumokba esést vizsgálunk Oracle segítségével: automata intervallumokra osztás és intervallumba való tartozás vizsgálata 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Hisztogram függvények WIDTH_BUCKET(oszlop, minimum, maximum, intervallumok_száma); Egyenlő méretű, megadott darabszámú rész-intervallum létrehozása a megadott [minimum..maximum[ intervallumon belül NTILE(darabszám) OVER ([PARTITION BY xxx] ORDER BY yyy) Egyenlő taglétszámú, megadott darabszámú rész-intervallum létrehozása a sorrendezett mező szerint 2017.04.04. szabo.zsolt@nik.uni-obuda.hu
Hisztogram függvények SELECT ename, sal, width_bucket(sal, 0, 6000, 5) as histo FROM emp ORDER BY sal; SELECT ename, sal, ntile(5) over (order by sal) as histo FROM emp ORDER BY sal; SELECT ename, sal, width_bucket(sal, (select min(sal) from emp), (select max(sal) from emp), 5) as histo FROM emp ORDER BY sal; SELECT deptno, ename, sal, ntile(2) over (partition by deptno order by sal) as histo FROM emp ORDER BY deptno, sal; 2017.04.04. szabo.zsolt@nik.uni-obuda.hu