Autor Zpráva
nowis
Profil
Zdravím a opět prosím o pomoc s formulací dotazu,

mám tabulku se sloupci: ID, ID_kontakt, datum, predmet, typ
zjednodušeně by se dalo říct, že jde o termíny schůzek s jednotlivými klienty.

Potřeboval bych vyjet tabulku, kde pro každé ID_kontakt bude jeden řádek s poslední schůzkou. Tedy tak, aby na tom řádku bylo relevantní ID, predmet a typ. Tuším, že bych měl použít formuli HAVING, ale nemám s tím zkušenost a nějak se mi zatím nepovedlo dosáhnou správného výsledku.

Jak na to?

Děkuji!
Keeehi
Profil
V této oblasti si nejsem moc jistý, ale funguje mi toto
SELECT * FROM tabulka GROUP BY ID_kontakt HAVING datum = max(datum);
nowis
Profil
Keeehi:
Díky, takto nějak jsem to zkoušel, ale vracelo mi to prázdný výsledek. Tak zkusím hledat chybu jinde, než ve formulaci dotazu.
TomášK.
Profil *
Ono to má nedeterministické chování.

A similar MySQL extension applies to the HAVING clause. In standard SQL, a query cannot refer to nonaggregated columns in the HAVING clause that are not named in the GROUP BY clause. To simplify calculations, a MySQL extension permits references to such columns. This extension assumes that the nongrouped columns have the same group-wise values. Otherwise, the result is indeterminate.

Ve většině databází:
WITH tt AS   SELECT MAX(datum) OVER(PARTITION BY id_kontakt) AS posledni_datum, * FROM t) 
SELECT * FROM tt WHERE posledni_datum = datum

V MySQL to půjde podobně - v poddotaze vybrat poslední datum ke každému kontaktu a pak podle toho filtrovat.
Keeehi
Profil
TomášK.:
Přesně proto jsem psal, že si nejsem jistý.

Takž rozhodně správná varianta je:
SELECT tabulka.*
FROM tabulka
JOIN (
    SELECT ID_kontakt, MAX(datum) AS datum
    FROM tabulka
    GROUP BY ID_kontakt
) AS t ON tabulka.ID_kontakt = t.ID_kontakt AND tabulka.datum = t.datum
nowis
Profil
Keeehi:
Super! Díky

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: