Autor Zpráva
wolf
Profil
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
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
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
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
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é.

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