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
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
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
TomášK:
díky za ujasneni
Keeehi
Profil
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
Keeehi:
Můžeš to ukázat na tom mém přikladu?
Keeehi
Profil
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
Keeehi:
Nefunguje, syntaktický error, asi to ještě nezná.
Keeehi
Profil
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í).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0