proc
SELECT row_number() AS XX FROM YYY WHERE XX = 10;
nejde?
Názory k článku
CTE a analytické funkce v PostgreSQL
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 :)
preto nemozu byt ani vo where klauzule.
inac vyzera to pekne :), presne ako v Oracle :)
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 (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
?
having xx = 10
?
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 (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..
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 (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í.
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 :)
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! (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?
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í.
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 (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.
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.
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 :)
V každém případě zmíněné alternativní řešení je taky možnost :)
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
select temp_table.b, rownum from temp_table
order by temp_table.b
B ROWNUM
---------- ----------
58 2
60 4
70 1
99 3
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)).
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)).
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.
V tomhle se právě liší rownum a limit.
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
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! (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.
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 (neregistrovaný)
6. 5. 2009 19:28
Nový
CTE a Firebird
celé vláknoCo 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.
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.
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 (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"

