sql >> Databasteknik >  >> RDS >> Mysql

Hur hittar man saknade datarader med 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'

Denna fråga kommer att returnera kupletter som du kan använda för att välja data som saknas. Den saknade informationen kommer att ha en tidsstämpel mellan hival och loval för varje kuplett som returneras av frågan.

EDIT - tack för att kolla, Craig

EDIT2 :

få de saknade tidsstämplarna - denna SQL blir lite svårare att läsa, så jag delar upp den lite. Först behöver vi ett sätt att beräkna en serie tidsstämpelvärden mellan ett givet lågt värde och ett högt värde i 10 minuters intervall. Ett sätt att göra detta när du inte kan skapa tabeller är baserat på följande sql, som skapar alla siffror från 0 till 9 som en resultatuppsättning.

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

...genom att nu kombinera den här tabellen med en kopia av sig själv ett par gånger betyder det att vi dynamiskt kan generera en lista med en specificerad längd

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 börjar den här delen av sql närma sig vad vi behöver. Den har 2 indatavariabler:

  1. en starttidsstämpel (Jag använde curdate() i exemplet); och en
  2. antal iterationer - varsatsen anger 42 iterationer i exemplet, maximalt med 3 x siffror är 1000 intervaller

... vilket betyder att vi kan använda den ursprungliga sql för att driva exemplet från ovan för att generera en serie tidsstämplar för varje hival lowval-par. Håll ut med mig, denna sql är lite lång 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 finns det lite episk sql
OBS! Att använda siffertabellen 3 gånger ger en maximal lucka som täcker lite över 6 dagar



  1. Korrekthet och begränsningar

  2. Arbeta med Java Data i Sisense

  3. PDO och MySQL "mellan"

  4. Transient felhantering i .net core 2.1 MVC för MySQL Database