sql >> データベース >  >> RDS >> PostgreSQL

時系列のギャップを検出して削除します

    クエリを1つだけ作成します:

    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
    2つの変更がありました:
    -会社別のパーティション日付別の注文 ORDER BY IDの代わりに
    -数値への明示的なキャスト(整数が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 
    

    これで、削除クエリが機能するはずです:

    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. Windows10UWPアプリからSQLサーバーデータベースに接続する方法

    2. IDの自動インクリメントをリセットしますか? phpmyadmin

    3. MySQLが外部キーにCOMMENTを追加する

    4. INSERTクエリを使用して、あるテーブルから別のテーブルに行をコピーします