sql >> Databasteknik >  >> RDS >> PostgreSQL

Upptäck och ta bort luckor i tidsserier

Jag skulle bara skapa en fråga:

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
)

Ett sammansatt index på (företag + värde) kolumner kan hjälpa till att få en maximal hastighet på denna fråga.

REDIGERA

Frågan ovan fungerar inte
Jag har korrigerat den något, här är en demo:http://sqlfiddle.com/#!15/c9bfe/7
Två saker har ändrats:
- INDELNING EFTER företag ORDER EFTER datum istället för ORDER BY id
- explicit cast till numerisk (eftersom heltal har trunkerats till 0):
ÖVER (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 

och nu borde raderingsfrågan fungera:

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. MySQL-fråga - Summa kapaciteten hos flera lager

  2. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Inga operationer tillåtna efter att anslutningen stängts

  3. Räkna rader i partitionen med Order By

  4. Hur man ändrar mysql root-lösenordet