Autor | Zpráva | ||
---|---|---|---|
Hitman Profil |
#1 · Zasláno: 9. 2. 2017, 00:21:08
Řeším takovou drobnost, nenepadá mě ale jak ji se svými znalostmi efektivně vyřešit. V DB mám řekněme produkty se strukturou:
nazev cena mesto rohlik 50 praha chleba 100 praha rohlik 60 brno rohlik 120 praha Potřebuji vypsat průměrnou cenu rohlíku (produktu) v celé ČR s tím že každé město se započítá jen jednou a to poslední. Průměrná cena rohlíku tedy bude 60+120/2. Hodnota z prvního řádku se zanedbá. Používám tohle řešení: SELECT SUM(cena)/count(cena) AS prumer_cen FROM produkty WHERE nazev='rohlik' A potřebuji pouze doplnit něco ve smyslu WHERE unique_last(mesto). Díky |
||
TomášK Profil |
#2 · Zasláno: 9. 2. 2017, 00:32:38
Databáze nemá fixované pořadí záznamů, potřebuješ nějaký sloupec, podle které se to řadí, aby mělo význam mluvit o posledním záznamu.
SUM(cena)/count(cena) jde zapsat jako AVG(cena)
Jsou k dispozici window funkce nebo je to MySQL? Postup bude v poddotazu vybrat "poslední" produkt pro každé město a udělat z toho průměr. |
||
Alphard Profil |
#3 · Zasláno: 9. 2. 2017, 07:39:46
Hitman [#1]:
Návrhově, to je nějaká historie cen? Jestli by nestálo za úvahu zavést sloupec, která cena je aktivní a která ne. Ten by se musel sice udržovat nějak zvlášť, ale dotazy na aktuální ceny by pak byly naprosto triviální. Princip hledání posledního záznamu je zde Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou, sloupec čas nebo id (jak psal [#2] TomášK) tam snad máte. |
||
Hitman Profil |
Ano, slopupec ID záznamu samozdřejmě mám. Takže by to mělo být obalené ještě v jednom selectu?
Něco jako SELECT AVG(cena) AS prumer_cen (SELECT FROM produkty WHERE nazev='rohlik' LIMIT 1 ORDER BY id DESC) ? // je to aktuální cena, s tím že tam není vyřešené mazání těch starých při vkládání nových (pokud praha přidá novou cenu rohlíku, měla by se ta stará smazat/updatovat...je tam více sloupců jako platnost atp. takže jednodušší bude asi mazání). Ale i když tam mazání bude, myslím že nebude na škodu projistotu vybírat jen ten poslední, kdyby se náhodou nějaká stará nevymazala, tak ať to potom nepočítá s nějakou neaktuální cenou.. |
||
Kajman Profil |
#5 · Zasláno: 9. 2. 2017, 12:24:39
Ne, v poddotaze potřebujete přeci nejvyšší id pro každé město.
SELECT Avg(p.cena) prumer FROM (SELECT Max(id) maxid FROM produkty WHERE nazev = 'rohlik' GROUP BY mesto) m JOIN produkty p ON m.maxid = p.id |
||
Hitman Profil |
#6 · Zasláno: 9. 2. 2017, 13:53:38
Aha, to je ono, díky.
|
||
Časová prodleva: 8 let
|
0