Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
Díky Kajmanovi jsem objevil v nové verzi MySQL / MariaDB Window funkce.
Chvíli si s tím hraju a vybírám tolik oblíbené (X posledních článků z Y kategorií). Vypadá to takto: SELECT * FROM ( SELECT c.id, c.datum_vytvoreni, c.nadpis, c.category, ROW_NUMBER() OVER w AS 'poradi' FROM clanky c WINDOW w as (PARTITION BY category ORDER BY c.datum_vytvoreni DESC) ) tmp WHERE tmp.poradi <= 5 ORDER BY category ASC, poradi DESC A je to funkční, akorát mě zajímá, je nutný nadřazený select? Lze omezit výslednou sadu hodnot z WINDOW rovnou v oné úrovni dotazu, ve kterém se vykonává? (= tj bez nadřazeného selectu). |
||
Kcko Profil |
PS. Ještě z jiného soudku a jen pro zajímavost:
Dotaz na hranici 5 posl. článků z každé kategorie (resp i jeho torzo select k.id, (select c.id from clanky c where c.category = k.ID order by c.id desc limit 4, 1) hranice from clanky_kategorie k je v Maria DB 10.2 nefunkční (hranice je vždycky NULL), v MySQL 5.x funkční, vtipné. PS2. Navíc je to blbě, nikde není přeci psáno, že nejvyšší ID je nejposlednější článek ne? (Co třeba řazení podle datumu atd). |
||
Kajman Profil |
#3 · Zasláno: 25. 8. 2018, 00:03:43
Zkusil bych dát podmínku do having. Null při menším počtu než 5 řeší v příkladu ifnull. Pro zjednodušení tam je id. S datumem se musí hledat i datum i id.
|
||
Kcko Profil |
#4 · Zasláno: 25. 8. 2018, 00:09:40
Kajman:
At narvu Having kamkoliv rve to na mě syntaktický error. Add NULL, tak mám stejný dotaz / tabulky v Mysql i Maria DB, v Maria DB je hranice NULL, v mysql Idcka clanku, ktera jsou korektní. Add ten datum a hranice, nechceš do tam dopsat? (Ne pro mě, ale pro ostatní a relevantnost). |
||
TomášK Profil |
Kcko
A je to funkční, akorát mě zajímá, je nutný nadřazený select? Ano. Window funkce se podle specifikace mají vykovávat až po GROUP BY , WHERE a HAVING a co si vybavuju, tak to bylo vždy potřeba obalit, tedy to zřejmě databáze i dodržují.
|
||
Kcko Profil |
#6 · Zasláno: 25. 8. 2018, 08:45:29
TomášK:
díky za ujasneni |
||
Keeehi Profil |
#7 · Zasláno: 25. 8. 2018, 18:57:27
Kcko:
Podmínky které se mají vyhodnocovat až po vykonání window funkcí (třeba na omezení počtu výsledků) se zapisují za QUALIFY. Tedy alespoň v Teradatě. |
||
Kcko Profil |
#8 · Zasláno: 25. 8. 2018, 20:36:30
Keeehi:
Můžeš to ukázat na tom mém přikladu? |
||
Keeehi Profil |
#9 · Zasláno: 26. 8. 2018, 22:15:11
SELECT c.id, c.datum_vytvoreni, c.nadpis, c.category, ROW_NUMBER() OVER (PARTITION BY category ORDER BY c.datum_vytvoreni DESC) AS poradi FROM clanky AS c QUALIFY poradi <= 5 ORDER BY category ASC, poradi DESC |
||
Kcko Profil |
#10 · Zasláno: 27. 8. 2018, 17:14:39
Keeehi:
Nefunguje, syntaktický error, asi to ještě nezná. |
||
Keeehi Profil |
#11 · Zasláno: 27. 8. 2018, 17:42:10
Kcko:
„asi to ještě nezná“ Ano, MariaDB to ještě nezná. Je to vidět i z mariadb.com/kb/en/library/window-functions-overview kde podobný případ rozebírají a v závěru použijí právě vnořený select. |
||
Kcko Profil |
Keeehi:
JJ, aspoň si to pročtu, díky. Já hlavně koukal, na Mysql.com, předpokládal jsem; že to bude podobné (chování). |
||
Časová prodleva: 5 let
|
0