sql >> Database >  >> RDS >> PostgreSQL

Hoe selecteer ik efficiënt de vorige niet-null-waarde?

Ik vond dit antwoord voor SQL Server die ook in Postgres werkt. Omdat ik het nog nooit eerder had gedaan, vond ik de techniek best slim. Kortom, hij maakt een aangepaste partitie voor de vensterfunctie door een case-instructie te gebruiken in een geneste query die een som verhoogt wanneer de waarde niet null is en deze anders met rust laat. Hierdoor kan men elke null-sectie afbakenen met hetzelfde nummer als de vorige niet-null-waarde. Dit is de vraag:

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

En de resultaten:

 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)


  1. Aanbevolen manier/volgorde om gegevens van een webservice te lezen, die gegevens te ontleden en in een SQLite-database in te voegen

  2. ODBC gebruiken met Salesforce en Azure Active Directory (AD) Single Sign On (SSO)

  3. Een kopie van uw database herstellen

  4. Virtuele cloudmachines vergelijken met beheerde clouddatabases