PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как ефективно да избера предишната ненулева стойност?

Намерих този отговор за SQL Server, който също работи в Postgres. Никога не съм го правил преди, мислех, че техниката е доста умна. По принцип той създава персонализиран дял за функцията за прозорец, като използва оператор case вътре във вложена заявка, която увеличава сумата, когато стойността не е нула, и я оставя сама в противен случай. Това позволява да се очертае всяка нулева секция със същия номер като предишната ненулева стойност. Ето заявката:

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

И резултатите:

 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Улесняване на управлението на производствена PostgreSQL база данни

  2. Актуализиране на времевата марка, когато редът се актуализира в PostgreSQL

  3. PG::DuplicateTable:ГРЕШКА:публикациите за връзка вече съществуват

  4. [Видео] Въведение в типовете данни JSON в PostgreSQL

  5. PostgreSQL конвенции за именуване