sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur väljer jag effektivt det tidigare icke-nullvärdet?

Jag hittade det här svaret för SQL Server som också fungerar i Postgres. Efter att aldrig ha gjort det förut tyckte jag att tekniken var ganska smart. I grund och botten skapar han en anpassad partition för fönsterfunktionen genom att använda en case-sats inuti en kapslad fråga som ökar en summa när värdet inte är null och lämnar det ifred annars. Detta gör att man kan avgränsa varje nollsektion med samma nummer som det tidigare icke-nullvärdet. Här är frågan:

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

Och 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. Använder Oracle JDeveloper 12c med Oracle Database, del 2

  2. Hur man skapar pivottabell i MySQL

  3. Hur LIKE-operatören fungerar i MariaDB

  4. Rapportera SQLDIAG-prestandadata via RML Utilities Tool | SQL Server Performance Felsökning -7