Sprawdzenie sąsiednich rekordów

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;

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.

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...

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;
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.

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

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