Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana menemukan baris data yang hilang menggunakan 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'

Kueri ini akan mengembalikan bait yang dapat Anda gunakan untuk memilih data yang hilang. Data yang hilang akan memiliki stempel waktu antara hival dan loval untuk setiap bait yang dikembalikan oleh kueri.

EDIT - terima kasih sudah memeriksa, Craig

EDIT2 :

mendapatkan stempel waktu yang hilang - SQL ini menjadi sedikit lebih sulit untuk dibaca, jadi saya akan memecahnya sedikit. Pertama, kita membutuhkan cara untuk menghitung serangkaian nilai cap waktu antara nilai rendah yang diberikan dan nilai tinggi dalam interval 10 menit. Cara melakukan ini ketika Anda tidak dapat membuat tabel didasarkan pada sql berikut, yang menghasilkan semua digit dari 0 hingga 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

...sekarang dengan menggabungkan tabel ini dengan salinan dirinya beberapa kali berarti kita dapat secara dinamis menghasilkan daftar dengan panjang tertentu

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

... sekarang bagian dari sql ini mendekati apa yang kita butuhkan. Ini memiliki 2 variabel input:

  1. stempel waktu awal (saya menggunakan curdate() dalam contoh); dan
  2. jumlah iterasi - di mana klausa menentukan 42 iterasi dalam contoh, maksimum dengan tabel 3 x digit adalah 1000 interval

... yang berarti kita dapat menggunakan sql asli untuk menggerakkan contoh dari atas untuk menghasilkan serangkaian cap waktu untuk setiap pasangan hival lowval. Bersabarlah, sql ini agak panjang sekarang...

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

...sekarang ada sedikit epik sql
CATATAN :menggunakan tabel angka 3 kali memberikan celah maksimum, itu akan mencakup sedikit lebih dari 6 hari



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengatur struktur indeks ElasticSearch dengan beberapa binding entitas

  2. Situs Penyingkatan URL

  3. Cara Mencegah Batas Waktu Koneksi untuk Impor MySQL Besar

  4. Perbedaan antara pernyataan sql dan klausa

  5. Mendapatkan respons HTML alih-alih JSON di android