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

PostgreSQL - kolonneværdi ændret - vælg forespørgselsoptimering

Sådan ville jeg gøre det med en analytisk:

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

Opdatering (noget forklaring):

Analytiske funktioner fungerer som et efterbehandlingstrin. Forespørgselsresultatet er opdelt i grupperinger (partition by ), og den analytiske funktion anvendes i sammenhæng med en gruppering.

I dette tilfælde er forespørgslen et udvalg fra p . Den analytiske funktion, der anvendes, er LAG . Da der ikke er nogen partition by klausul, er der kun én gruppering:hele resultatsættet. Denne gruppering er sorteret efter id . LAG returnerer værdien af ​​den forrige række i grupperingen ved hjælp af den angivne rækkefølge. Resultatet er, at hver række har en ekstra kolonne (aliased prev_val), som er val af den foregående række. Det er underforespørgslen.

Derefter ser vi efter rækker, hvor val matcher ikke val af den forrige række (prev_val). COALESCE håndterer specialtilfældet af den første række, som ikke har en tidligere værdi.

Analytiske funktioner kan virke lidt mærkelige i starten, men en søgning på analytiske funktioner finder en masse eksempler på, hvordan de fungerer. For eksempel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Bare husk, at det er et efterbehandlingstrin. Du vil ikke være i stand til at udføre filtrering osv. på værdien af ​​en analytisk funktion, medmindre du underforespørger den.



  1. laravel databaseforbindelse returnerer udefineret indeksfejl

  2. Hvad er DTU i Azure SQL Database, og hvordan finder man ud af, hvor meget vi har brug for

  3. mysql kommando timeout fejl

  4. Simulering af langvarig Oracle DB-forespørgsel