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

Откриване и премахване на пропуски във времевите редове

Бих създал само една заявка:

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
)

Композитен индекс на колони (компания + стойност) може да помогне за постигане на максимална скорост на тази заявка.

РЕДАКТИРАНЕ

Горната заявка не работи
Коригирах я леко, ето демонстрация:http://sqlfiddle.com/#!15/c9bfe/7
Две неща са променени:
- ДЯЛ ПО фирма ПОРЪЧКА ПО дата вместо ПОРЪЧАЙ ПО id
- изрично преобразуване към числово (тъй като цялото число е съкратено до 0):
НАД (ДЕЛЕНИЕ ПО фирма)::числово

  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 

и сега заявката за изтриване трябва да работи:

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. Postgres:изчистете цялата база данни преди повторно създаване/попълване от bash скрипт

  2. Как EDB стана лидер на пазара на Postgres

  3. Писане на JSON колона в Postgres с помощта на Pandas .to_sql

  4. Кумулативен сбор от стойности по месеци, попълване на липсващите месеци

  5. SQLAlchemy, изолиране на сериализируеми транзакции и повторни опити по идиоматичен начин на Python