sql >> Database >  >> RDS >> PostgreSQL

Hiaten in tijdreeksen detecteren en verwijderen

Ik zou slechts één zoekopdracht maken:

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
)

Een samengestelde index op (bedrijf + waarde) kolommen kan helpen om een ​​maximale snelheid van deze zoekopdracht te krijgen.

BEWERKEN

De bovenstaande query werkt niet
Ik heb het iets aangepast, hier is een demo:http://sqlfiddle.com/#!15/c9bfe/7
Er zijn twee dingen gewijzigd:
- VERDELING OP bedrijf ORDER OP datum in plaats van ORDER BY id
- expliciete cast naar numeriek (omdat gehele getallen zijn afgekapt tot 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 

en nu zou de verwijderquery moeten werken:

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. Postgresql:Geen toegang tot bestand « $libdir/postgis-2.1 » geen dergelijk bestand of map

  2. Java-database-abstractie voor GWT (of:is Hibernate een goede keuze?)

  3. Welke gebruiker moet /usr/local/mysql op Mac bezitten?

  4. Rijdoelen, deel 3:Anti-joins