Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Średnia parametru w funkcji czasu
Forum PHP.pl > Forum > Bazy danych > MySQL
Hori
W tabeli mam parametry z wartoscią liczbowa i timestamp co minutę.
Obecnie pobieram średnią z ostaniej godziny.

Sprawdzam też jak długo wstecz średnia utrzymuje się w danym przedziale.

Obecnie robie to w pętli php zmniejszając datę/czas początkowe o pięć minut i sprawdzam czy jeszcze średnia jest w danym przedziale.

Czy można to samo zrealizować wyłącznie poprzez jedno zapytanie do mySQL?
trueblue
Nie wiem czy to Ci coś ułatwi, ale poniższe zapytanie pokazuje średnie w interwałach czasowych co 5 minut (w przeciągu ostatnich ~8 godzin) począwszy od maksymalnej godziny (ostatniego pomiaru).

  1. SELECT interwal, MAX(w.czas), AVG(w.wartosc)
  2. FROM wartosc AS w,
  3. (SELECT MAX(czas) AS maks FROM wartosc) AS maks,
  4. (SELECT (a.a+10*b.a)*5 AS interwal FROM (
  5. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
  6. CROSS JOIN
  7. (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
  8. )) AS interwaly
  9. WHERE w.czas<=(DATE_SUB(maks, INTERVAL interwal MINUTE)) AND w.czas>(DATE_SUB(DATE_SUB(maks, INTERVAL 60 MINUTE), INTERVAL interwal MINUTE))
  10. GROUP BY interwal


Tabela wartosc ma kolumny: id_wartosc, czas (DATETIME), wartosc

Hori
Dzięki, query ciekawe, pewnie gdzies sie przyda...

Ja szukam czegos w rodzaju
select ilosc_minut od teraz wstecz z tabela
jesli srednia parametru za ten okres wynosi powyzej x..

Chyba jednak trzeba zostać przy pętli i tak długo cofać się w czasie jak dlugo średnia się utrzymuje powyżej wartości.

Potrzebuje to do serwisu aurora.report , te 'kafelki' daja kolorystyczną reprezentację wartości danego parametru, ale istotne jest też jak dlugo parametr ma dany poziom wartości.
Nie da się niestety pójść po samej wartości dla timestamp, bo chwilowy spadek/wzrost parametru nie ma dużego wplywu na calość monitorowanego zjawiska.
Stąd średnia, a jeszcze lepiej mediana... ale to już nie wchodzi w zakres mojego pytania.
trueblue
A jak zadana jest ta graniczna wartość średniej? To jest najświeższa średnia, czy po prostu jakaś inna, z zewnątrz?
Bo jeśli to drugie, to wystarczy do tego zapytania dodać warunek i wyciągnąć pierwszy, najstarszy rekord ze średnią w tym zakresie.
Hori
To jest tak...
Jest część prezentująca stan obecny, to te wartości na 'kafelkach' i jest część odpowiedzialna za predykcje.
To wlaśnie na potrzeby predykcji sprawdzam (teraz w petli) jak dlugo srednia utrzymuje sie w danym zakresie.
Niby dużego opóźnienia ta pętla nie wprowadza, bo jeśli średnia za ostanią godzinę jest poniżej pewnej wartości (albo powyżej zera dla Bz które działa odwrotnie) to nic więcej się nie liczy i algorytm nie wchodzi w pętle.

To działa, liczy, ale jak to bywa, z czasem szukamy bardziej eleganckich rozwiązań.




x= 60min
srednią liczy dz wartości miedzy (teraz - x) a teraz..
jeśli średnia wieksza niż wartość progowa, wchodzi w pętle..
petla tylko zwiększa x o 5min i wykonuje się póki średnia nie spadnie ponizej zadanej wartosci.
x - 5min to czas używany do predykcji.


Dla każdego parametru jest 5 przedzialów, z tym że jeden jest poniżej progu wejścia w pętle (zielony kafelek)

trueblue
Zapytanie, które pokazałem liczy średnią od czasu ostatniego wyniku (X), do godziny wstecz (X-60).
Średnia jest obliczana z przesunięciem 5 minut 100-krotnie.
Czyli kolejna średnia z przedziału X-5 do X-65, kolejna X-10 do X-70, itd.

W prosty sposób można zmodyfikować zapytanie, aby startować od konkretnego czasu, a nie czasu najświeższego wyniku.

Natomiast dodając warunek na obliczoną w każdym powyższym przedziale średnią i wybierając najświeższy jeden wynik (obydwa działania w tym zapytaniu), otrzymamy, jak rozumiem szukany wynik.
Hori
Szukanym wynikiem jest liczba minut, dla ktorej srednia od teraz wstecz zachowuje ciąglość powyzej pewnej wartości... bez sprawdzenia kolejno zwróconych przez twoje query rekordów chyba nie dostaniemy tej liczby minut, czyli tez trzeba wejsc w pdtle... ale jutro wezme twoj pomysl na warsztat i zobacze co sie da zmodyfikowac.

Dzieki
trueblue
Znajdując najświeższy rekord niespełniający warunków, będziesz wiedział, że od nowszego od niego o 5 minut do najnowszego, jest zachowana ciągłość.
Nadal można to zrobić w zapytaniu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.