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

Deteksi dan hapus celah dalam deret waktu

Saya hanya akan membuat satu kueri:

DELETE FROM mytable 
WHERE company in (
  SELECT Company 
  FROM (
    SELECT Company, 
      COUNT(CASE WHEN value IS NULL THEN 1 END) 
         OVER (PARTITION BY company ORDER BY id 
               ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
      COUNT(CASE WHEN value IS NULL THEN 1 END) 
         OVER (PARTITION BY company)
      / 
      COUNT(*) 
         OVER (PARTITION BY company) As p50
  ) alias
  WHERE cnt >= 3 OR p50 > 0.5
)

Indeks gabungan pada kolom (perusahaan + nilai) dapat membantu mendapatkan kecepatan maksimum kueri ini.

EDIT

Kueri di atas tidak berfungsi
Saya telah sedikit memperbaikinya, berikut adalah demonya:http://sqlfiddle.com/#!15/c9bfe/7
Dua hal telah diubah:
- PARTISI MENURUT perusahaan ORDER BY date alih-alih ORDER BY id
- eksplisit dilemparkan ke numerik( karena bilangan bulat telah dipotong menjadi 0):
LEBIH (PARTISI OLEH perusahaan)::numerik

  SELECT company, cnt, p50
  FROM (
    SELECT company, 
      COUNT(CASE WHEN value IS NULL THEN 1 END) 
         OVER (PARTITION BY company ORDER BY date 
               ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
      SUM(CASE WHEN value IS NULL THEN 1 ELSE 0 END) 
         OVER (PARTITION BY company)::numeric
      / 
      COUNT(*) 
         OVER (PARTITION BY company) As p50
    FROM mytable
  ) alias
--  WHERE cnt >= 3 OR p50 > 0.5 

dan sekarang kueri penghapusan akan berfungsi:

DELETE FROM mytable 
WHERE company in (
      SELECT company
      FROM (
        SELECT company, 
          COUNT(CASE WHEN value IS NULL THEN 1 END) 
             OVER (PARTITION BY company ORDER BY date 
                   ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) As cnt,
          SUM(CASE WHEN value IS NULL THEN 1 ELSE 0 END) 
             OVER (PARTITION BY company)::numeric
          / 
          COUNT(*) 
             OVER (PARTITION BY company) As p50
        FROM mytable
      ) alias
    WHERE cnt >= 3 OR p50 > 0.5
)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tulis anomali Skew di Oracle dan PostgreSQL tidak mengembalikan transaksi

  2. Konfigurasi awal Postgresql:Bagaimana cara mengakses sebagai pengguna postgres?

  3. Bagaimana cara menjalankan banyak kueri menggunakan perintah psql dari bash shell?

  4. Mendapatkan fungsi kesalahan to_date (stempel waktu tanpa zona waktu, tidak diketahui) tidak ada

  5. Fungsi Kueri Dinamis Postgres