Nietypowe zapytanie - prośba o pomoc |
Nietypowe zapytanie - prośba o pomoc |
4.03.2018, 13:42:16
Post
#1
|
|
Grupa: Zarejestrowani Postów: 140 Pomógł: 0 Dołączył: 14.01.2017 Ostrzeżenie: (0%) |
Witajcie.
Potrzebuję wykonać takie zapytanie do bazy: Z rekordów od teraz wstecz o 1440 minut wyszukaj rekordy, które po sobie miały wartość 0. Jeśli znajdzie zwróci true. Dla zobrazowania. 2018-03-04 13:30:00 1 2018-03-04 13:31:00 1 2018-03-04 13:32:00 1 2018-03-04 13:33:00 0 | 2018-03-04 13:34:00 0 | 2018-03-04 13:35:00 0 | 2018-03-04 13:36:00 0 | 2018-03-04 13:37:00 0 | Tu znalazł 10 rekordów po sobie więc zwraca TRUE 2018-03-04 13:38:00 0 | 2018-03-04 13:39:00 0 | 2018-03-04 13:40:00 0 | 2018-03-04 13:41:00 0 | 2018-03-04 13:42:00 0 | 2018-03-04 13:43:00 1 2018-03-04 13:44:00 1 2018-03-04 13:45:00 0 | 2018-03-04 13:46:00 0 | Ale tu już nie było 10 po sobie więc je pomija. 2018-03-04 13:47:00 1 2018-03-04 13:48:00 1 Nie mam pojęcia jak się zabrać za takie zapytanie Proszę o pomoc bardziej doświadczonych. Na razie mam tylko do wyszukiwania ile razy było 0
Ten post edytował topcio 4.03.2018, 13:45:40 |
|
|
4.03.2018, 13:48:40
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Zawsze między rekordami jest różnica pełnej minuty?
-------------------- |
|
|
4.03.2018, 13:55:12
Post
#3
|
|
Grupa: Zarejestrowani Postów: 140 Pomógł: 0 Dołączył: 14.01.2017 Ostrzeżenie: (0%) |
tak
Tym wstawiam rekordy
ale może się zdarzyć tak, że np między 11.55 a 12.04 jest przerwa konserwacyjna w testach. |
|
|
4.03.2018, 21:32:08
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Żeby wyjaśnić, to od środka:
To zapytanie ponumeruje grupy. Grupa to zakres od wybranej godziny do ostatniej w puli. Czyli pierwsza grupa to rekordy od 0 do N, druga od 1 do N, trzecia od 2 do N, itd.:
Teraz dodajemy licznik zmieniający się w ramach grupy. Licznik się przyda, bo chcemy wybrać z każdej grupy 10 rekordów. Nie możemy użyć aliasu grupa w warunkach, więc żeby go nie powtarzać, to obudowujemy w zapytanie:
Tu już możemy zgrupować grupy wybierając z każdej tylko rekordy od numeru 1 do 10 i sumując ilość 0. To jest ostateczne zapytanie, które pokazuje ilość 0 od danej godziny włącznie + 9 kolejnych rekordów w przód:
Gdybyś miał ciągłe godziny, to całość byłaby znacznie prostsza. -------------------- |
|
|
4.03.2018, 23:29:22
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
|
|
|
4.03.2018, 23:55:37
Post
#6
|
|
Grupa: Zarejestrowani Postów: 140 Pomógł: 0 Dołączył: 14.01.2017 Ostrzeżenie: (0%) |
trueblue -> dzięki za poświęcenie, jednak Twoje rozwiązanie to pożeracz zasobów, działa prawie OK, ale jedno zapytanie wykonuje się około 15s, a ma się to wykonywać co 1min przy odświeżaniu strony.
mmmmmmm -> jeszcze większe dzięki, to jest chyba to o co mi chodziło, teraz muszę do wpasować w interfejs i zobaczę w praktyce. Ale wykonuje się w 10ms, więc jest cool Natrafiłem jednak na pewnie problem w rozwiązaniu mmmmmmmm, otóż gdy np mamy po sobie 14 rekordów z zerami on to zaliczy razy 3, a powinien tylko raz, to chyba powinno być w tym ustawieniu + interval 9 minut, aby więcej też zliczał, może jakieś MIN tam wstawić, ale jak tego nie wiem. Ten post edytował topcio 5.03.2018, 00:18:55 |
|
|
5.03.2018, 08:09:38
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 761 Pomógł: 1822 Dołączył: 11.03.2014 Ostrzeżenie: (0%) |
Natrafiłem jednak na pewnie problem w rozwiązaniu mmmmmmmm, otóż gdy np mamy po sobie 14 rekordów z zerami on to zaliczy razy 3, a powinien tylko raz, to chyba powinno być w tym ustawieniu + interval 9 minut, aby więcej też zliczał, może jakieś MIN tam wstawić, ale jak tego nie wiem. Rozwiązanie mmmmmmm nie jest prawidłowe, bo opiera się na założeniu, że rekordy są w postaci ciągłej. Wystarczy zmienić 13:42 kończącą zakres zer na 13:50 i dalej kolejne godziny, i wynik jest niepoprawny. Pisałem, że rozwiązanie, które podałem można uprościć gdyby rekordy były w postaci ciągłej, ale w Twoim założeniu może być przerwa. Zamiast zapytania, możesz wynik "otrzymywać" w trakcie zapisu rekordów. Mianowicie tworzysz drugą tabelę z godziną, flagą i ilością, i w momencie pojawienia się nowego rekordu: 1. Jeśli dla danej godziny jest flaga 0 i ostatnia zapisana godzina miała również flagę 0, to dodajesz do kolumny ilość ostatniego rekordu 1. 2. Jeśli dla danej godziny jest flaga 0 i ostatnia zapisana godzina miała flagę 1, to zapisujesz nową godzinę z ilością 0 i flagą 0. 3. Analogicznie robisz dla flagi 1. Ten post edytował trueblue 5.03.2018, 08:39:15 -------------------- |
|
|
6.03.2018, 00:03:44
Post
#8
|
|
Grupa: Zarejestrowani Postów: 140 Pomógł: 0 Dołączył: 14.01.2017 Ostrzeżenie: (0%) |
Rozwiązanie mmmmmmm nie jest prawidłowe, bo opiera się na założeniu, że rekordy są w postaci ciągłej. Wystarczy zmienić 13:42 kończącą zakres zer na 13:50 i dalej kolejne godziny, i wynik jest niepoprawny. Pisałem, że rozwiązanie, które podałem można uprościć gdyby rekordy były w postaci ciągłej, ale w Twoim założeniu może być przerwa. Masz rację, nie pomyślałem o tym, przy sprawdzaniu. Zamiast zapytania, możesz wynik "otrzymywać" w trakcie zapisu rekordów. Mianowicie tworzysz drugą tabelę z godziną, flagą i ilością, i w momencie pojawienia się nowego rekordu: 1. Jeśli dla danej godziny jest flaga 0 i ostatnia zapisana godzina miała również flagę 0, to dodajesz do kolumny ilość ostatniego rekordu 1. 2. Jeśli dla danej godziny jest flaga 0 i ostatnia zapisana godzina miała flagę 1, to zapisujesz nową godzinę z ilością 0 i flagą 0. 3. Analogicznie robisz dla flagi 1. Że też na to nie wpadłem, to jest chyba najsensowniejsze. Zaraz coś napiszę o zobaczę, ale chyba to jest to. Wydaje mi się, że ogarnąłem. Zrobiłem tak. 1. Plik tworzony, dla każdego testowanego hosta
Objaśnienie: Pobieramy z głównej tabeli ostatni status
Pobieramy z tabeli pomocniczej ostatnie ID dla testowanego hosta
Zwiększamy licznik
Jeśli w tabeli pomocniczej nie istnieje żaden wpis dla testowanego hosta, albo status jest inny
I na koniec tak jak było do tabeli głównej dopisujemy zdarzenie (1/0)
Wszystko działa poprawnie, ale taka konkluzja mnie naszła, że w sumie mógłbym to zrobić na jednej tabeli. W tabeli pomocniczej dodać tylko kolumnę ostatni status i zamiast pobierać go z głównej wszystko robić w tej pomocniczej. Bo ta główna jest mi potrzebna do zliczenia ile razy był offline w ciągu np ostatnich 24h, ale przecież mogę sumować licznik, choć będzie to mniej dokładne, bo jeśli licznik zaczął się 25h tamu i jest cały czas OffLine to mi nie zliczy poprawnie - jeśli się nie mylę. Narobiłem się z tym, więc chyba zostawię tak jak jest - przynajmniej na razie. Mam jeszcze sporo innych rzeczy do ogarnięcia, więc niech działa jak działa. Dzięki wszystkim za pomoc, temat rozwiązany - można zamknąć. |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 13:26 |