PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara saya memilih nilai non-null sebelumnya secara efisien?

Saya menemukan jawaban ini untuk SQL Server yang juga berfungsi di Postgres. Karena belum pernah melakukannya sebelumnya, saya pikir tekniknya cukup pintar. Pada dasarnya, ia membuat partisi khusus untuk fungsi windowing dengan menggunakan pernyataan kasus di dalam kueri bersarang yang menambah jumlah ketika nilainya bukan nol dan membiarkannya sendiri sebaliknya. Ini memungkinkan seseorang untuk menggambarkan setiap bagian nol dengan nomor yang sama dengan nilai bukan nol sebelumnya. Berikut pertanyaannya:

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

Dan hasilnya:

 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. Bagaimana Atan2d() Bekerja di PostgreSQL

  2. PG::ConnectionBad:fe_sendauth:tidak ada kata sandi yang diberikan

  3. Mengurai pemutakhiran PostgreSQL

  4. Bagaimana cara mendapatkan daftar nama kolom dan tipe data tabel di PostgreSQL?

  5. Dengan sqlalchemy cara mengikat secara dinamis ke mesin database berdasarkan permintaan