PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - Spaltenwert geändert - Abfrageoptimierung auswählen

So würde ich es mit einer Analyse machen:

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

Aktualisierung (einige Erklärungen):

Analytische Funktionen arbeiten als Nachbearbeitungsschritt. Das Abfrageergebnis wird in Gruppierungen aufgeteilt (partition by ) und die analytische Funktion wird im Kontext einer Gruppierung angewendet.

In diesem Fall ist die Abfrage eine Auswahl aus p . Die angewendete Analysefunktion ist LAG . Da es keine partition by gibt -Klausel gibt es nur eine Gruppierung:die gesamte Ergebnismenge. Diese Gruppierung ist nach id geordnet . LAG gibt den Wert der vorherigen Zeile in der Gruppierung in der angegebenen Reihenfolge zurück. Das Ergebnis ist, dass jede Zeile eine zusätzliche Spalte (alias prev_val) hat, die der val ist der vorhergehenden Reihe. Das ist die Unterabfrage.

Dann suchen wir nach Zeilen, in denen der val stimmt nicht mit val überein der vorherigen Zeile (prev_val). Die COALESCE behandelt den Sonderfall der ersten Zeile, die keinen vorherigen Wert hat.

Analytische Funktionen mögen auf den ersten Blick etwas seltsam erscheinen, aber eine Suche nach analytischen Funktionen findet viele Beispiele, die erklären, wie sie funktionieren. Beispiel:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Denken Sie nur daran, dass es sich um einen Nachbearbeitungsschritt handelt. Sie können den Wert einer Analysefunktion nicht filtern usw., es sei denn, Sie führen eine Unterabfrage durch.