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つの入力変数があります:
- 開始タイムスタンプ(例ではcurdate()を使用)。と
- 反復回数-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日間でカバーできる最大のギャップが得られます