sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu efektivně vybrat předchozí nenulovou hodnotu?

Našel jsem tuto odpověď pro SQL Server, který také funguje v Postgres. Protože jsem to nikdy předtím nedělal, považoval jsem techniku ​​za docela chytrou. V zásadě vytvoří vlastní oddíl pro funkci oken pomocí příkazu case uvnitř vnořeného dotazu, který zvýší součet, když hodnota není nulová, a jinak jej ponechá na pokoji. To umožňuje vymezit každý prázdný oddíl stejným číslem jako předchozí nenulová hodnota. Zde je dotaz:

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

A výsledky:

 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. Srovnání mezi pluginem MySQL Clone a Xtrabackup

  2. Sledování synchronizace replik skupiny dostupnosti

  3. Jak nastavit možnost maxrecursion pro CTE uvnitř funkce Table-Valued-Function

  4. Typy dat SQL VARCHAR Co dělat a co nedělat pro rychlejší databáze