Autor | Zpráva | ||
---|---|---|---|
JardaB Profil |
#1 · Zasláno: 16. 9. 2019, 08:34:13
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 |
#2 · Zasláno: 16. 9. 2019, 08:50:05
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 |
#3 · Zasláno: 16. 9. 2019, 09:27:42
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 |
#4 · Zasláno: 16. 9. 2019, 10:10:15
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 |
#6 · Zasláno: 17. 9. 2019, 09:43:18
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 |
#7 · Zasláno: 18. 9. 2019, 09:52:02
Tohle by mohlo fungovat, vyzkouším a dám vědět. Prozatím děkuji.
|
||
Časová prodleva: 1 rok
|
0