sql >> Database teknologi >  >> RDS >> PostgreSQL

Registrer SQL-øen over flere parametre og betingelser

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



  1. Er Oracles ORA_HASH tilfældig?

  2. Tjek, om en tabel har en fremmednøgle i SQL Server med OBJECTPROPERTY()

  3. SQL Server - Hvornår skal man bruge Clustered vs non-Clustered Index?

  4. UnsatisfiedLinkError i native metode