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

Wykrywaj i usuwaj luki w szeregach czasowych

Utworzyłbym tylko jedno zapytanie:

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
)

Złożony indeks w kolumnach (firma + wartość) może pomóc w uzyskaniu maksymalnej szybkości tego zapytania.

EDYTUJ

Powyższe zapytanie nie działa
Poprawiłem je trochę, oto demo:http://sqlfiddle.com/#!15/c9bfe/7
Zmieniły się dwie rzeczy:
- PARTITION BY firmy ORDER BY data zamiast ORDER BY id
- jawne rzutowanie na numeric( ponieważ liczba całkowita została obcięta do 0):
OVER (PARTITION BY company)::numeric

  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 

a teraz zapytanie usuwające powinno działać:

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. Psycopg / Postgres :Połączenia kończą się losowo

  2. Jak znaleźć tabele, które odwołują się do określonego wiersza za pomocą klucza obcego?

  3. Uwierzytelnianie hasłem kończy się niepowodzeniem przy złożonym haśle

  4. Wiele indeksów a pojedynczy indeks w wielu kolumnach w postgresql

  5. Zmień pusty ciąg na NULL, gdy kolumna ma ograniczenie DATE