Sprawdzenie sąsiednich rekordów

Odpowiedz Nowy wątek
2019-07-05 13:21
0

Witam jestem jeszcze dość początkującą osobą w SQL i mam problem z uzyskaniem wyniki z bazy, mianowicie, muszę pobrać ilość zmian IsBusy (kolumna o wartości 0-1). Tak jak mi się wydaje, sprawdzanie tego na zasadzie -> (rekord != rekord+1) lub jak na niektórych stronkach przeczytałem (rekord<>rekord+1), powinno dać mi oczekiwany rezultat. Poniżej są zapytania, które wydaje mi się powinny pójść, ale otrzymuję, albo same 1, albo same 0 z porównania <> lub !=.

SELECT COUNT(H1.IsBusy<>H2.IsBusy+1)
FROM History H1
JOIN History H2 ON H1.idHistory = H2.idHistory
WHERE H1.Address IN (
SELECT detectorID
FROM Czujniki
WHERE parkingID = 115
);

W tym zapytaniu, względem posortowanej tablicy.

SELECT COUNT() FROM (
SELECT
FROM History
WHERE Address
IN (
SELECT detectorID
FROM Czujniki
WHERE parkingID = 115)
ORDER BY Address DESC
) AS H1
WHERE (H1.IsBusy != H1.IsBusy+1) = 0;

Pozostało 580 znaków

2019-07-05 13:27
1

Może coś takiego?

SELECT COUNT(*)
FROM History h1
INNER JOIN History h2 ON h2.id = h1.id + 1 AND h2.IsBusy <> h1.IsBusy

Można by też pokombinować z funkcjami okna.


edytowany 1x, ostatnio: Patryk27, 2019-07-05 13:28

Pozostało 580 znaków

2019-07-05 15:48
2

Liczenie na to, że ID będzie większe o 1 (zwłaszcza przy wielodostępie) to jeden z podstawowych błędów projektowych...

A w jaki sposób przejść przez całą tabelę? i sprawdzenie, w którym miejscy się zmienia wartość ? - IvanPacanov 2019-07-10 07:02
@IvanPacanov: Podaj więcej szczegółów. Jaka wartość, jaka wersja MySQL... - Marcin.Miga 2019-07-10 08:28
jest to na serwerze phpMyAdmin wersja 5.7.26-0ubuntu0.16.04.1, i mam 4 tabele, idHistory, DateTime, Address, isBusy, Problem polega na tym, że w tabeli jest mnóstwo rekordów niepotrzebnych, i mam np kilkadziesiąt rekordów informujących, że dany Address ma ciągle wartość isBusy=1, (Co oznacza, że jest zajęty). I cel zapytania jakie próbuję zrobić, to znaleźć wszystkie przejścia wartości isBusy z 0 na 1, dla danego Address, względem DateTime, - IvanPacanov 2019-07-10 09:22
Odpowiadaj w postach, nie komentarzach. Najlepiej stwórz próblke danych na jakimś fiddlu i podaj oczekiwany wynik dla nich - Marcin.Miga 2019-07-10 09:37
ok już wrzuciłem poniżej, - IvanPacanov 2019-07-10 12:37

Pozostało 580 znaków

2019-07-10 12:22
0

Wiec poprawiając pytanie, mam taką tabelę (History), w niej muszę znaleźć moment przejścia 0 na 1 dla danego Address
screenshot-20190710121035.png

Jedna z wielu prób, które testowałem

  SELECT *
  FROM History h1
  INNER JOIN History h2
  WHERE h2.idHistory < h1.idHistory
  AND   h1.isBusy <> h2.isBusy
  AND h1.Address = 561;

Pozostało 580 znaków

2019-07-10 13:57
0

Ten przykład jest zły. Sortując po idHistory w rekordach 770581-770582 będzie przejście z 1 na 0, a nie z 0 na 1.

Pozostało 580 znaków

2019-07-10 14:00
0

Spróbuj tak:

SELECT *, (SELECT isBusy FROM History WHERE idHistory>h.idHistory AND Address=h.Address ORDER BY idHistory LIMIT 1) nextIsBusy FROM History h ORDER BY idHistory

EDIT: dopisany warunek na Address

edytowany 1x, ostatnio: Marcin.Miga, 2019-07-10 14:01
Było dobre, ale na na tak duże liczbie danych nie dawało rady, poniżej jest zapytanie, które mi poszło. - IvanPacanov 2019-07-15 12:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0