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

SQLを使用して欠落データ行を見つける方法は?

    select t1.ts as hival, t2.ts as loval
    from metdata t1, metdata t2
    where t2.ts = (select max(ts) from metdata t3
    where t3.ts < t1.ts)
    and not timediff(t1.ts, t2.ts) = '00:10:00'
    

    このクエリは、欠落データを選択するために使用できるカプレットを返します。欠落しているデータには、クエリによって返された各カプレットのhivalとlovalの間のタイムスタンプがあります。

    編集-チェック用のthx、Craig

    EDIT2:

    欠落しているタイムスタンプを取得する-このSQLは少し読みにくくなるので、少し分割します。まず、10分間隔で特定の低い値と高い値の間の一連のタイムスタンプ値を計算する方法が必要です。テーブルを作成できない場合にこれを行う方法は、0から9までのすべての数字を結果セットとして作成する次のSQLに基づいています。

    select d1.* from 
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d1
    

    ...このテーブルをそれ自体のコピーと数回組み合わせることで、指定した長さのリストを動的に生成できるようになります

    select curdate() + 
    INTERVAL  (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE 
    as date 
    from (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d1
    join
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d2
    join
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d3
    where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and 42
    order by 1
    

    ...現在、このSQLは必要なものに近づいています。 2つの入力変数があります:

    1. 開始タイムスタンプ(例ではcurdate()を使用)。と
    2. 反復回数-whereclauseは例で42回の反復を指定し、3x桁のテーブルの最大値は1000間隔です

    ...これは、元のSQLを使用して上記の例を駆動し、各hivallowvalペアの一連のタイムスタンプを生成できることを意味します。我慢してください、このSQLはもう少し長いです...

    select daterange.loval + INTERVAL  (d1.digit * 100 + d2.digit * 10 + d3.digit) * 10 MINUTE as date 
    from 
    (select t1.ts as hival, t2.ts as loval
    from metdata t1, metdata t2
    where t2.ts = (select max(ts) from metdata t3
    where t3.ts < t1.ts)
    and not timediff(t1.ts, t2.ts) = '00:10:00'
    ) as daterange
    join
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d1
    join
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d2
    join
    (select 1 as digit
    union select 2 
    union select 3 
    union select 4 
    union select 5 
    union select 6 
    union select 7 
    union select 8 
    union select 9 
    union select 0 
    ) as d3
    where (d1.digit * 100 + d2.digit * 10 + d3.digit) between 1 and
     round((time_to_sec(timediff(hival, loval))-600) /600)
    order by 1
    

    ...ちょっとした壮大なSQLがあります
    注:数字の表を3回使用すると、6日間でカバーできる最大のギャップが得られます



    1. OracleIN句でのLIKEの使用

    2. 成功したMySQLDELETEは何を返しますか? DELETEが成功したかどうかを確認するにはどうすればよいですか?

    3. BCPユーティリティを使用してデータをフラットファイルにエクスポートし、一括挿入を使用してデータをインポートする方法

    4. 初心者の場合、MySQLとPostgreSQLには大きな違いがありますか