Autor | Zpráva | ||
---|---|---|---|
wolf Profil |
#1 · Zasláno: 7. 10. 2020, 15:48:24
Ahoj,
mám tabulku stavysds pro evidenci spotřeby energie s touto strukturou ID, Datum, Impuls, Diference, SdsID, Uptime Když chci zjistit spotřebu např. za celý měsíc zadám dotaz select (max(stavysds.Impuls) - min(stavysds.Impuls)) / sds.PrepoctovaKonstanta as kwh from stavysds inner join sds on stavysds.SdsID = sds.ID where stavysds.Datum between '2020-10-01 00:00' and '2020-10-31 23:59' and SdsID = 2; pokud to chci po dnech zadám SELECT cast(Datum as Date), (max(stavysds.Impuls) - min(stavysds.Impuls)) / sds.PrepoctovaKonstanta AS kwh, sds.Nazev, stavysds.SdsID FROM stavysds INNER JOIN sds ON stavysds.SdsID = sds.ID WHERE stavysds.Datum BETWEEN '2020-10-01 00:00' AND '2020-10-31 23:59' AND stavysds.SdsID =2 GROUP BY cast(stavysds.Datum as Date), sds.Nazev, sds.PrepoctovaKonstanta, stavysds.SdsID ORDER BY stavysds.Datum, sds.Nazev; když ale sečtu hodnoty jednotlivých řádků po dnech, dostanu se na jiný výsledek než za celý měsíc |
||
Kajman Profil |
#2 · Zasláno: 7. 10. 2020, 16:11:44
Když budete mít hodnoty
čas - impuls pondělí 23:40:00 - 5 pondělí 23:50:00 - 10 úterý 00:10:00 - 15 úterý 00:20:00 - 20 Tak se při groupování dle dnů napíše 5 a 5. Při odečtu min a max celého setu bude ale výsledek 15. Pokud máte v diference rozdíl od posledního měření, použijte sum(diference). Jinak musíte odčítat od maxima posledního předešlého dne, ne z minima toho dne. |
||
wolf Profil |
#3 · Zasláno: 8. 10. 2020, 10:22:32
Kajman:
Pole Diference obsahuje jinou hodnotu, nelze ji použít s hodnotou pole Impuls. Zkusil jsem dotaz přepsat takto: SELECT cast(Datum as Date), (max(stavysds.Impuls) - (select max(stavysds.Impuls) as min_imp from stavysds where stavysds.Datum between '2020-09-30 00:00:00' and '2020-09-30 23:59:59' and stavysds.SdsID = 2)) / sds.PrepoctovaKonstanta AS kwh, sds.Nazev, stavysds.SdsID FROM stavysds INNER JOIN sds ON stavysds.SdsID = sds.ID WHERE stavysds.Datum BETWEEN '2020-10-01 00:00' AND '2020-10-07 23:59' AND stavysds.SdsID = 2 GROUP BY cast(stavysds.Datum as Date), sds.Nazev, sds.PrepoctovaKonstanta, stavysds.SdsID ORDER BY stavysds.Datum, sds.Nazev; jenže v tomto případě se přebere druhá hodnota max vždy z intervalu 2020-09-30 a neposouvá se jako v předchozím dotazu. Jak to napsat, aby se hodnota v sub query posouvala automaticky? |
||
Kajman Profil |
V korelovaném dotaze hledejte spíše něco jako
(select h.Impuls from stavysds h where h.sdsid=stavysds.sdsid and h.datum<cast(stavysds.Datum as Date) order by h.datum desc limit 1) Umí verze databáze window funkce? To by dotaz zjednodušilo a zrychlilo. Např. tento dotaz něco vrátí? SELECT Row_number() OVER() rownumer FROM dual |
||
wolf Profil |
#5 · Zasláno: 8. 10. 2020, 15:38:37
Kajman:
na serveru je verze 5.5.57, po zadání dotazu SELECT Row_number() OVER() rownumer FROM dual dostanu chybové hlášení (1305): FUNCTION Row_number does not exist
|
||
Kajman Profil |
#6 · Zasláno: 9. 10. 2020, 07:51:44
U takové prastaré verze bych si udělal pomocnou tabulku s kalendářními dny. Udělal dotaz na ni a pak pro každý chtěný den odečetl hodnoty získané pomocí těch poddotazů s limit 1. Když na té tabulce bude vícesloupcový index (sdsid, datum), tak by to mohlo být celkem svižné.
|
||
Časová prodleva: 2 roky
|
0