sql >> Database >  >> RDS >> Mysql

Hoe ontbrekende gegevensrijen te vinden met behulp van 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'

Deze query retourneert coupletten die u kunt gebruiken om de ontbrekende gegevens te selecteren. De ontbrekende gegevens hebben een tijdstempel tussen hival en loval voor elk couplet dat door de query wordt geretourneerd.

EDIT - thx voor het controleren, Craig

EDIT2 :

de ontbrekende tijdstempels krijgen - deze SQL wordt een beetje moeilijker te lezen, dus ik zal het een beetje opsplitsen. Ten eerste hebben we een manier nodig om een ​​reeks tijdstempelwaarden te berekenen tussen een bepaalde lage waarde en een hoge waarde in intervallen van 10 minuten. Een manier om dit te doen als u geen tabellen kunt maken, is gebaseerd op de volgende sql, die als resultaat alle cijfers van 0 tot 9 maakt.

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

...door deze tabel nu een paar keer te combineren met een kopie van zichzelf, kunnen we dynamisch een lijst met een opgegeven lengte genereren

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 komt dit stukje sql in de buurt van wat we nodig hebben. Het heeft 2 invoervariabelen:

  1. een starttijdstempel (ik gebruiktecurdate() in het voorbeeld); en een
  2. aantal iteraties - de where-clausule specificeert 42 iteraties in het voorbeeld, maximum met 3 x cijfertabellen is 1000 intervallen

... wat betekent dat we de originele sql kunnen gebruiken om het bovenstaande voorbeeld aan te sturen om een ​​reeks tijdstempels te genereren voor elk hival lowval-paar. Even geduld, deze sql is nu een beetje lang...

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 is er een beetje epische sql
OPMERKING:als u de tabel met cijfers 3 keer gebruikt, krijgt u een maximale opening van iets meer dan 6 dagen



  1. PIVOT-query op verschillende records

  2. mysql tinyint(1) vs tinyint(2) vs tinyint(3) vs tinyint(4)

  3. Verleen privileges voor een bepaalde database in PostgreSQL

  4. De grenswaarden ophalen voor een gepartitioneerde tabel in SQL Server (T-SQL)