Portál AbcLinuxu, 11. května 2025 07:37
Ahoj lidi. Mam takovy problemek s jednim SQL dotazem.
Mam jednoduchou tabulku, kde je sloupec datum a sloupec teplota. A potrebuju jednim dotazem vybrat datum, teplotu a teplotu pred mesicem (tedy datum-mesic).
Sesmolil jsem na to takovyto dotaz, ktery mi vsak tvrdosijne vraci jako druhou teplotu hodnotu NULL.
Pokud spustim jenom samotny dotaz, bez predchoziho SELECTU, tak to funguje dobre. SQL dotaz zde:
SELECT cas, temp_out, (SELECT temp_out FROM wwsdb AS wwsdb2 WHERE wwsdb2.cas = DATE_ADD(wwsdb.cas, INTERVAL -1 MONTH)) FROM wwsdb AS wwsdb
Nemate nekdo nejaky napad, jak to z databaze vytahnout?
Databaze obsahuje datum s presnosti na 5 min a ma v sobe zaznamy za 2 roky, takze urcite obsahuje datum treba dnesek a -1 mesic s tim samym casem.
Diky za pomoc.
Ahoj. Diky za odpoved.
Nakopnul jsi me tim spravnym smerem.
Databaze obsahuje zaznamy za 5 min (takze moje zbozne prani bylo vyslyseno, viz. prispevek nize), ale zrovna na konci a na zacatku vypisu (ktery jsem sledoval) jsem zjistil, ze jsou data za predchazejici mesic nekonzistentni, proto to pise ty NULL. Jinak v ostatnim obdobi jsou vysledky v poradku.
A ja trubka jsem se porad soustredil na ten vypis, kde jsem se podival na zacatek, samy NULL, prepnul na konec a zase NULL.
A az kdyz jsi napsal, tak jsem se juknul jinam a ejhle, cisla
Takze zaver: SQL dotaz je v poradku a vse funguje jak ma.
Diky!
cas = DATE_ADD(...)
použij rozsah a nech si spočítat průměr se sousedními hodnotami:
... (SELECT AVG(temp_out) FROM wwsdb AS wwsdb2 WHERE wwsdb2.cas BETWEEN (wwsdb.cas + INTERVAL -1 MONTH - INTERVAL 7 MINUTE) AND (wwsdb.cas + INTERVAL -1 MONTH - INTERVAL 7 MINUTE)) ...
Pak ti nebude vadit, pokud nějaká hodnota náhodou bude chybět, nebo pokud bude o minutu vedle.
Pro větší množství dat takový dotaz bude značně pomalý, takže bych tento výpočet spouštěl při vkládání nových dat do databáze a výsledek si ukádal do dalšího sloupečku. Nezapomeň si udělat jeden index nad časem a teplotou, aby databáze mohla počítat jen s daty v indexu a nepotřebovala pak ještě sahat do tabulky.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.