Svar på opdateret spørgsmål
SELECT *
FROM (
SELECT *
,lag(val, 1, 0) OVER (PARTITION BY status ORDER BY id) last_val
,lag(status) OVER (PARTITION BY val ORDER BY id) last_status
FROM t1
) x
WHERE status = 1
AND (last_val <> val OR last_status = 0)
Hvordan?
Samme som før, men denne gang kombinere to vinduesfunktioner. Tænd for en enhed kvalificerer, hvis ..
1. den sidst tændte enhed var en anden en.
2. eller den samme enhed er blevet slukket i sin sidste post. Hjørnehuset med NULL
for den første række af partitionen er irrelevant, for så er rækken allerede kvalificeret i 1.
Svar på den originale version af spørgsmålet.
Hvis du forstår din opgave korrekt, klarer denne enkle forespørgsel opgaven:
SELECT *
FROM (
SELECT *
,lag(val, 1, 0) OVER (ORDER BY id) last_on
FROM t1
WHERE status = 1
) x
WHERE last_on <> val
Returnerer række 1, 3, 6, 7 som anmodet.
Hvordan?
Underforespørgslen ignorerer al slukning, da det kun er støj, ifølge din beskrivelse. Efterlader poster, hvor en enhed er tændt. Blandt disse er det kun de poster, der diskvalificeres, hvor den samme enhed allerede var tændt (den sidste indgang tændte). Brug vinduefunktionen lag()
for det. Især giver jeg 0
som standard dækker det specielle tilfælde af den første række - forudsat at der ikke er nogen enhed med val = 0
.
Hvis der er, vælg et andet umuligt tal.
Hvis intet tal er umuligt, skal du lade det specielle tilfælde være NULL
med lag(val) OVER ...
og i den ydre forespørgsel tjek med:
WHERE last_on IS DISTINCT FROM val