Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да намерите липсващи редове с данни с помощта на 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'

Тази заявка ще върне куплети, които можете да използвате, за да изберете липсващите данни. Липсващите данни ще имат времева марка между hival и loval за всеки куплет, върнат от заявката.

РЕДАКТИРАНЕ - благодаря за проверката, Крейг

РЕДАКТИРАНЕ2 :

получаване на липсващите времеви марки - този SQL става малко по-труден за четене, така че ще го разбия малко. Първо, имаме нужда от начин да изчислим поредица от стойности на времеви отпечатъци между дадена ниска стойност и висока стойност на интервали от 10 минути. Начин за това, когато не можете да създавате таблици, се основава на следния sql, който създава като резултат всички цифри от 0 до 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

...сега като комбинираме тази таблица с нейно копие няколко пъти означава, че можем динамично да генерираме списък с определена дължина

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

... сега това парче sql се доближава до това, от което се нуждаем. Той има 2 входни променливи:

  1. начална дата (в примера използвах curdate()); и а
  2. брой итерации - клаузата where определя 42 итерации в примера, максимумът с 3 х цифрени таблици е 1000 интервала

... което означава, че можем да използваме оригиналния sql, за да управляваме примера отгоре, за да генерираме серия от времеви печати за всяка двойка hival lowval. Потърсете ме, този sql вече е малко дълъг...

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

...сега има малко епичен sql
ЗАБЕЛЕЖКА:използването на таблицата с цифри 3 пъти дава максимална празнина, която ще покрие от малко над 6 дни



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL многоколонен първичен ключ

  2. MySQL group_concat_max_len в заявка

  3. MySQL дава на редовете цял живот

  4. Как да настроите MySQL да използва GMT в Windows и Linux

  5. Създаване на функции в phpMyAdmin - Грешка:достъпът е отказан, имате нужда от супер привилегията за тази операция