PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak efektywnie wybrać poprzednią wartość inną niż null?

Znalazłem tę odpowiedź dla SQL Server, który działa również w Postgresie. Ponieważ nigdy wcześniej tego nie robiłem, pomyślałem, że technika jest całkiem sprytna. Zasadniczo tworzy niestandardową partycję dla funkcji okienkowej, używając instrukcji case w zagnieżdżonym zapytaniu, która zwiększa sumę, gdy wartość nie jest pusta, aw przeciwnym razie pozostawia ją samą. Pozwala to na wytyczenie każdej sekcji o wartości null tym samym numerem, co poprzednia wartość niepusta. Oto zapytanie:

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 wyniki:

 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. Czysty sposób na korzystanie z funkcji okna postgresql w django ORM?

  2. Implementacja konfiguracji wielu centrów danych dla PostgreSQL — część druga

  3. Błąd podczas przesyłania danych do Heroku:przesunięcie strefy czasowej poza zakres

  4. Uzyskiwanie wpisanych wyników z surowego SQL ActiveRecord

  5. Czy podczas wykonywania PITR byłoby możliwe wstrzymanie/wznowienie w PostgreSQL?