sql >> Databáze >  >> RDS >> Mysql

Jak najít chybějící datové řádky pomocí 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'

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é:

  1. počáteční časové razítko (v příkladu jsem použilcurdate()); a
  2. 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í



  1. Pochopení analýzy velkých dat

  2. Jak získat přístup k připojení mysqli v jiné třídě na jiné stránce?

  3. PostgreSQL:Který datový typ by měl být použit pro měnu?

  4. Výhradní! Přidejte se k nám s naším hostem Michalem Barem, manažerem programu Access