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

Wie wähle ich effizient den vorherigen Nicht-Null-Wert aus?

Ich habe diese Antwort für SQL Server gefunden, die auch in Postgres funktioniert. Da ich das noch nie zuvor gemacht hatte, fand ich die Technik ziemlich clever. Im Grunde erstellt er eine benutzerdefinierte Partition für die Windowing-Funktion, indem er eine case-Anweisung innerhalb einer verschachtelten Abfrage verwendet, die eine Summe erhöht, wenn der Wert nicht null ist, und sie ansonsten in Ruhe lässt. Dadurch kann jeder Nullabschnitt mit der gleichen Nummer wie der vorherige Nicht-Nullwert abgegrenzt werden. Hier ist die Abfrage:

SELECT
  id, value, value_partition, first_value(value) over (partition by value_partition order by id)
FROM (
  SELECT
    id,
    value,
    sum(case when value is null then 0 else 1 end) over (order by id) as value_partition

  FROM p
  ORDER BY id ASC
) as q

Und die Ergebnisse:

 id | value | value_partition | first_value
----+-------+-----------------+-------------
  1 |   100 |               1 |         100
  2 |       |               1 |         100
  3 |       |               1 |         100
  4 |       |               1 |         100
  5 |       |               1 |         100
  6 |       |               1 |         100
  7 |       |               1 |         100
  8 |   200 |               2 |         200
  9 |       |               2 |         200
(9 rows)