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'
Tento dotaz vrátí dvojverší, která můžete použít k výběru chybějících dat. Chybějící data budou mít časové razítko mezi hival a loval pro každý kuplet vrácený dotazem.
EDIT - díky za kontrolu, Craig
EDIT2:
získávání chybějících časových razítek – tento SQL je o něco hůře čitelný, takže to trochu rozeberu. Nejprve potřebujeme způsob, jak vypočítat řadu hodnot časového razítka mezi danou nízkou hodnotou a vysokou hodnotou v 10minutových intervalech. Způsob, jak toho dosáhnout, když nemůžete vytvářet tabulky, je založen na následujícím sql, který vytvoří jako výslednou sadu všechny číslice od 0 do 9.
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
...nyní několikanásobným zkombinováním této tabulky s její kopií znamená, že můžeme dynamicky generovat seznam zadané délky
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
... teď se tento kus SQL blíží tomu, co potřebujeme. Má 2 vstupní proměnné:
- počáteční časové razítko (v příkladu jsem použilcurdate()); a
- počet iterací – klauzule where specifikuje v příkladu 42 iterací, maximum u tabulek se 3 číslicemi je 1000 intervalů
... což znamená, že můžeme použít původní sql k řízení příkladu shora ke generování série časových razítek pro každý hival lowval pár. Mějte se mnou, tento sql je teď trochu dlouhý...
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
...teď je tu trochu epické sql
POZNÁMKA:použití tabulky číslic 3x dává maximální mezeru, kterou pokryje něco přes 6 dní