Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
CTE a analytické funkce v PostgreSQL

LENIN POWER! aura:43
6. 5. 2009 0:38 Nový

kontrolni dotaz

celé vlákno
proc

SELECT row_number() AS XX FROM YYY WHERE XX = 10;

nejde?
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 1:28 Nový

Re: kontrolni dotaz

celé vlákno
lebo analyticke funkcie sa vykonavaju az nakoniec nad celym resultsetom.
preto nemozu byt ani vo where klauzule.

inac vyzera to pekne :), presne ako v Oracle :)
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 1:31 Nový

Re: kontrolni dotaz

celé vlákno
sorry, nie uplne nakoniec, order by je nakoniec (aspon v oracle), v postgre asi aj limit..
singer
singer (neregistrovaný)
6. 5. 2009 9:52 Nový

Re: kontrolni dotaz

celé vlákno
nemam tuto verziu psql, aby som vedel dane query otestovat, ale nefunguje:
having xx = 10
?
singer
singer (neregistrovaný)
6. 5. 2009 9:54 Nový

Re: kontrolni dotaz

celé vlákno
respektive ako pre agregacne funckie "having row_number()=10"
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 10:28 Nový

Re: kontrolni dotaz

celé vlákno
nie, analyticke funkcie su o tom, ze sa vykonavaju nad finalnym vysledkom
Takze najprv sa vykona subquery factoring (with), joiny, where klauzula, group by, having
az potom analyticke funkcie. Az ked mame vysledok, mozeme vykonavat nejake operacie nad tym vysledkom..

a potom sa to da este zotriedit cez order by a obmedzit limitom..
Honza
Honza (neregistrovaný)
6. 5. 2009 19:14 Nový

Re: kontrolni dotaz

celé vlákno
Ve window agregačních funkcích k takovému filtrování slouží operátor QUALIFY, který se vyhodnocuje až jako poslední.
kvr aura:95
kvr
6. 5. 2009 11:35 Nový

Re: kontrolni dotaz

celé vlákno
Nevím, zda je to ten samý případ, co v Oraclu, ale tam zabralo vyhodit podmínku až za select, i.e.:

select * from (select row_number() as xx from yyy) yyyi where xx = 10

Důvody viz výše, rownum určuje pořadí ve výsledku, tedy cokoliv kromě row_number() <= xxx je nesmysl. Alias z něj ve vnějším selectu udělá pevnou hodnotu. V Oraclu například vhodné pro implementaci limit :)
LENIN POWER!
LENIN POWER! (neregistrovaný)
6. 5. 2009 12:55 Nový

Re: kontrolni dotaz

celé vlákno
nedela se nahodou u oracle limit pomoci magickeho sloupce ROWNUM co se flakne do where?
kvr aura:95
kvr
6. 5. 2009 13:45 Nový

Re: kontrolni dotaz

celé vlákno
Upřesním - limit cnt a limit start, cnt. Pokud chcu prvních deset řádků, stačí samozřejmě jen přidat rownum <= 10. Pokud chcu limit z obou stran, je třeba to udělat složitěji, neboť podmínka z druhé strany z výše uvedených důvodů nefunguje, tedy je třeba rownum "exportovat" ven:

select ... from (select rownum as limit_row, ... from tab where filter order by sorter) where limit_row between limit_start and limit_start+limit_cnt-1

Navíc i v prvním případě, pokud bych chtěl použít order by, tak rownum nejspíš nebude fungovat podle očekávání.
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 14:35 Nový

Re: kontrolni dotaz

celé vlákno
toto nie je dobry sposob..

najprv sa zaznamy ocisluju az potom sa zoradia.. poriadie zaznamov z toho selektu bude nahodne..

dalsia vec je ze pokial date rownum von takymto sposobom, tak nevie pouzit stop count optimalizaciu, tj zotriedi, cely vstup (aj tak zbytocne, pretoze si vyberiete zaznamy podla nezotriedeneho rownum)

nizsie som uviedol priklad ako to ma vyzerat, v tom priklade sa netriedi cely vystup ale iba prvych :higest zaznamov.
kvr aura:95
kvr
6. 5. 2009 15:36 Nový

Re: kontrolni dotaz

celé vlákno
Upřímně, nemám teď po ruce Oracle, abych to vyzkoušel, ale mám dojem, že ten rownum byl sekvenční až po order by.

V každém případě zmíněné alternativní řešení je taky možnost :)
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 16:10 Nový

Re: kontrolni dotaz

celé vlákno
with temp_table as (select trunc(dbms_random.value(1,100)) b from dual connect by level < 5)
select temp_table.b, rownum from temp_table
order by temp_table.b

B ROWNUM
---------- ----------
58 2
60 4
70 1
99 3
kvr aura:95
kvr
6. 5. 2009 17:59 Nový

Re: kontrolni dotaz

celé vlákno
Ok, díky.
LENIN POWER!
LENIN POWER! (neregistrovaný)
6. 5. 2009 15:14 Nový

Re: kontrolni dotaz

celé vlákno
v DB2 sice funguje
WHERE rownum between X AND Y
ale neumi stop count optimalizaci. Navic optimalizer ma selectivitu tehle konstrukce uplne mimo misu (hardcoded 1/3 na 1 rownum podminku (between jsou 2)).
Franta Kučera aura:78
6. 5. 2009 12:57 Nový

Re: kontrolni dotaz

celé vlákno
"tedy cokoliv kromě row_number() <= xxx je nesmysl."
V tomhle se právě liší rownum a limit.
www.radino.eu
www.radino.eu (neregistrovaný)
6. 5. 2009 13:43 Nový

Re: kontrolni dotaz

celé vlákno
samozrejme v nadselekte uz je hodnota dostupna..

Ten posledny osdstavec je trochu popleteny :)

rownum je iba v Oracle, a inkrementuje sa s rastucim resultsetom (ked je splnena podmienka pre nejaky zaznam), takze v tom pripade naozaj vsetko ine ako rownum <= x je nezmyslel (este rownum = 1 ma zmysel)

row_number() je analyticka funkcia tak v Oracle a v Postgre, a tam je jedno ake predikaty na nu aplikujeme (v nadselekte).. - inac tato funkcia nie je v oracli lepsia z hladiska vykonu pre implementaciu pagingu ako rownum, pretoze sa vykona nad celym resultsetom, kym rownum umoznuje zastavit ziskavenie riadkov po nejakom pocte (STOPCOUNT optimalizacia),.

Priklad pagingu v oracle (ano, vyzera to hnusne :))
SELECT ename, sal, deptno FROM (
SELECT ename, sal, deptno, ROWNUM rnum FROM (
SELECT e.ename, e.sal, e.deptno
FROM emp e WHERE e.sal BETWEEN 1000 AND 3000
ORDER BY e.ename)
WHERE ROWNUM < :highest) -- stop count optimalizacia, cim neskorsia stranka tym viac prace
WHERE rnum > :lowest
LENIN POWER!
LENIN POWER! (neregistrovaný)
6. 5. 2009 13:12 Nový

DB2 COBRA 9.7 webcast

celé vlákno
http://tinyurl.com/DB297overview

Wednesday May 6, 2009,
11:30 AM Eastern / 10:30 AM Central / 8:30 AM Pacific /
4:30 PM London / 5:30 PM Munich

Seznamnte se s novinkami verze 9.7.
Ksl
Ksl (neregistrovaný)
6. 5. 2009 19:28 Nový

CTE a Firebird

celé vlákno
Co je mi známo, tak CTE a analytické funkce podporují všechny velké komerční databáze - Oracle a DB2 dlouho, MSSQL od verze 2005. PostgreSQL je první open source databází, kde jsou tyto funkce dostupné.
Ve Firebirdu byly CTE implementovány ve verzi 2.1, která je už rok na světě a final. :-) Viz Firebird 2.1 Release Notes > DML > Common Table Expressions.
Jan Sunavec aura:43
6. 5. 2009 20:57 Nový

Pekne dlhe

celé vlákno
Musim konstatovat ze Peter zas dodal dobru kvalitu. Tento krat trochu narocnu. Presiel som si priklady, vytvoril tabulky a vyskusal nove funkcie. Mozem povedat, ze PostgreSQL ma zas trochu blizsie k enteprise databazam. Nakoniec tento trend je pre PostgreSQL zjavny uz niekolko rokov.
Este drobna poznamka

SELECT row_number() OVER w, count(*) OVER w, *
FROM report
WINDOW w AS (PARTITION BY kategorie);

Je mozne pouzit aj

SELECT row_number() OVER (w ORDER BY report), count(*) OVER w, *
FROM report
WINDOW w AS (PARTITION BY kategorie);

V tomto priklade to nedava velky zmysel, ale pre ilustraciu fungovania to staci. Zjavne ten window len nahradzuje cast textu, teda sa da dalej rozsirovat.
uuu
uuu (neregistrovaný)
7. 5. 2009 6:17 Nový

Oprava

celé vlákno
"bych rád ukázal cestu ke dvou novým funkcím" opravit na "bych rád ukázal cestu ke dvěma novým funkcím"
Zasílat nově přidané příspěvky e-mailem