sql >> Database teknologi >  >> RDS >> Mysql

Hvordan finder man manglende datarækker ved hjælp af 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'

Denne forespørgsel returnerer koblinger, du kan bruge til at vælge de manglende data. De manglende data vil have et tidsstempel mellem hival og loval for hver kobling, der returneres af forespørgslen.

EDIT - tak for kontrol, Craig

EDIT2 :

at få de manglende tidsstempler - denne SQL bliver lidt sværere at læse, så jeg deler den lidt op. For det første har vi brug for en måde at beregne en række tidsstempelværdier mellem en given lav værdi og en høj værdi i 10 minutters intervaller. En måde at gøre dette på, når du ikke kan oprette tabeller, er baseret på følgende sql, som opretter som et resultatsæt alle cifrene fra 0 til 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

...ved at kombinere denne tabel med en kopi af sig selv et par gange betyder det, at vi dynamisk kan generere en liste med en specificeret længde

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

... nu nærmer dette stykke sql sig tæt på det, vi har brug for. Den har 2 inputvariable:

  1. et starttidsstempel (jeg brugte curdate() i eksemplet); og en
  2. antal iterationer - hvorklausulen angiver 42 iterationer i eksemplet, maksimum med 3 x ciffertabeller er 1000 intervaller

... hvilket betyder, at vi kan bruge den originale sql til at køre eksemplet fra oven for at generere en række tidsstempler for hvert hival lowval-par. Bær med mig, denne sql er lidt lang nu...

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

...nu er der lidt episk sql
BEMÆRK:Brug af taltabellen 3 gange giver et maksimalt mellemrum, det vil dække lidt over 6 dage



  1. Automatiser databasetestgendannelse i SQL Server

  2. MySQL Workbench-alternativer - ClusterControls peg-og-klik GUI

  3. Undgå sorteringer med Merge Join-sammenkædning

  4. Da SQL Server ikke har pakker, hvad gør programmører så for at komme uden om det?