proc
SELECT row_number() AS XX FROM YYY WHERE XX = 10;
nejde?
Vlákno názorů k článku
CTE a analytické funkce v PostgreSQL
www.radino.eu (neregistrovaný)
6. 5. 2009 1:28
Re: kontrolni dotaz
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
Re: kontrolni dotaz
sorry, nie uplne nakoniec, order by je nakoniec (aspon v oracle), v postgre asi aj limit..
singer (neregistrovaný)
6. 5. 2009 9:52
Re: kontrolni dotaz
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
Re: kontrolni dotaz
respektive ako pre agregacne funckie "having row_number()=10"
www.radino.eu (neregistrovaný)
6. 5. 2009 10:28
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
nedela se nahodou u oracle limit pomoci magickeho sloupce ROWNUM co se flakne do where?
6. 5. 2009 13:45
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
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
Re: kontrolni dotaz
"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
Re: kontrolni dotaz
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

