sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - kolomwaarde gewijzigd - selecteer query-optimalisatie

Dit is hoe ik het zou doen met een analyse:

SELECT id, val
  FROM ( SELECT id, val
           ,LAG(val) OVER (ORDER BY id) AS prev_val
       FROM p ) x
  WHERE val <> COALESCE(prev_val, val)
  ORDER BY id

Update (enige uitleg):

Analytische functies werken als een nabewerkingsstap. Het zoekresultaat is onderverdeeld in groepen (partition by ) en de analytische functie wordt toegepast binnen de context van een groepering.

In dit geval is de zoekopdracht een selectie uit p . De analytische functie die wordt toegepast is LAG . Aangezien er geen partition by clausule, is er maar één groepering:de volledige resultaatset. Deze groepering is gerangschikt op id . LAG retourneert de waarde van de vorige rij in de groepering in de opgegeven volgorde. Het resultaat is dat elke rij een extra kolom heeft (alias prev_val), de val van de vorige rij. Dat is de subquery.

Dan zoeken we naar rijen waar de val komt niet overeen met de val van de vorige rij (prev_val). De COALESCE behandelt het speciale geval van de eerste rij die geen vorige waarde heeft.

Analytische functies lijken in het begin misschien een beetje vreemd, maar een zoekopdracht naar analytische functies vindt veel voorbeelden die doornemen hoe ze werken. Bijvoorbeeld:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Onthoud alleen dat het een nabewerkingsstap is. U kunt de waarde van een analytische functie niet filteren, enz., tenzij u er een subquery op uitvoert.



  1. HAS_DBACCESS() – Ontdek of een gebruiker toegang heeft tot een database in SQL Server

  2. Recursief in cakephp3?

  3. Kraaienpootnotatie

  4. MYSQL - Gegevens selecteren uit de tweede rij in een grote tabel