Autor Zpráva
JardaB
Profil
Zdravím, poradí někdo, jak v následujícím případě upravit dotaz tak, abych dostal od každého uživatele jen jedno a.id_revir s nejvyšším ziskem?

Na každém revíru dosáhne uživatele za měsíc určitý zisk a mne zajímá pouze seznam s nejvyššími hodnotami od každého revíru.

SELECT  a.id id_revir, SUM( b.zisk ) / POW( POW( a.rozloha, 4 ) , 1 /6 ) zisk, a.nazev, c.nick, b.mesic, a.rozloha, c.id id_klient
             FROM vr3_reviry  a 
             JOIN vr3_ticket b ON a.id = b.id_revir 
             JOIN klient c ON a.id_klient = c.id 
             WHERE b.mesic BETWEEN 116 AND 138 AND a.rozloha BETWEEN 0.5 AND 100.0
             GROUP BY a.id, a.nazev, c.nick, b.mesic, a.rozloha, c.id 
             ORDER BY zisk DESC
Kajman
Profil
Máte verzi databáze umožňující window funkce?

Pokud ne, měla by to být obdoba třetího příkladu z Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou
JardaB
Profil
Kajman:

Ano to jsem již zkoušel, ale pravděpodobně je to malinko nad mé chápání. Zkoušel jsem následující:

SELECT SUM(b.zisk)/POW(POW(a.rozloha,4),1/6) zisk, a.nazev, c.nick, b.mesic, a.rozloha, c.id id_klient, a.id id_revir 
           FROM vr3_reviry a
           JOIN (SELECT d.id_revir, d.zisk, d.mesic FROM vr3_ticket d WHERE d.mesic BETWEEN 116 AND 138 GROUP BY  d.zisk, d.id_revir, d.mesic HAVING count(*)>1) b ON a.id  = b.id_revir
           JOIN klient c ON a.id_klient = c.id
           WHERE  a.rozloha BETWEEN 0.5 AND 100.0
           GROUP BY b.mesic, b.id_revir
           ORDER BY zisk DESC

Z mého pohledu vyhledá duplicity, nikoliv je vyloučí, ale i tak je to jistě chybně zapsáno..
Kajman
Profil
Použil jste špatný příklad, ten třetí začítá komentářem
-- pro každou kategorii najdi všechny řádky, kde je nejvyšší cena pro danou kategorii
JardaB
Profil
Kajman:

Ano děkuji. Buď jsem dotaz chybně upravil nebo jsem zcela nepochopil princip. Vrací sice maximální hodnoty, ale duplicita id_revir není vyloučena.

SELECT SUM(b.zisk)/POW(POW(a.rozloha,4),1/6) zisk, a.nazev, c.nick, b.mesic, a.rozloha, c.id id_klient, a.id id_revir 
           FROM vr3_reviry a
           JOIN (SELECT MAX(d.zisk) zisk, d.id_revir, d.mesic FROM vr3_ticket d WHERE d.mesic BETWEEN 116 AND 138  GROUP BY  d.id_revir, d.mesic) b ON a.id  = b.id_revir
           JOIN klient c ON a.id_klient = c.id
           WHERE  a.rozloha BETWEEN 0.5 AND 100.0
           GROUP BY b.mesic, b.id_revir
           ORDER BY zisk DESC



Opravdu by nešlo z původního dotazu ty duplicity odstranit např. pomocí HAVING ?

Ten problém tohoto dotazu dle nabízeného příkladu bude asi složitější kvůli SUM(b.zisk)/POW(POW(a.rozloha,4),1/6) zisk
Výpočet hodnoty závisí na hodnotě rozlohy z jiné tabulky.
Kajman
Profil
Problém je, že nemáte postgresql nebo mariadb ver. 10.2 nebo mysql ver. 8 nebo novější, tam to jde napsat pochopitelněji. Ve starých mysql můžete zkonstruovat dotaz dle faq. Najdete ke každému revíru maximální zisk a pak připojíte jen ty řádky, kde je ten zisk největší (což stále může u jednoho revíru dát více řádků, pokud je maximum vícekrát). Onen poddotaz je celý dotaz z [#1] (snad jen s umazaným order by).

select t1.*
from   (poddotaz) t1,
       (select t2.id_revir, max(t2.zisk) zisk
        from   (poddotaz) t2
        group  by t2.id_revir) t3
where  t1.id_revir = t3.id_revir
       and t1.zisk= t3.zisk
JardaB
Profil
Tohle by mohlo fungovat, vyzkouším a dám vědět. Prozatím děkuji.

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