Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để tìm các hàng dữ liệu bị thiếu bằng 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'

Truy vấn này sẽ trả về các câu ghép bạn có thể sử dụng để chọn dữ liệu bị thiếu. Dữ liệu bị thiếu sẽ có dấu thời gian giữa hival và loval cho mỗi câu ghép được trả về bởi truy vấn.

EDIT - thx để kiểm tra, Craig

EDIT2:

nhận được dấu thời gian bị thiếu - SQL này khó đọc hơn một chút, vì vậy tôi sẽ chia nhỏ nó một chút. Đầu tiên, chúng ta cần một cách để tính toán một loạt các giá trị dấu thời gian giữa một giá trị thấp nhất định và một giá trị cao trong khoảng thời gian 10 phút. Một cách thực hiện điều này khi bạn không thể tạo bảng là dựa trên sql sau đây, sẽ tạo dưới dạng tập hợp tất cả các chữ số từ 0 đến 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

... bây giờ bằng cách kết hợp bảng này với một bản sao của chính nó một vài lần có nghĩa là chúng ta có thể tạo động một danh sách có độ dài được chỉ định

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

... bây giờ mảnh sql này đang tiến gần đến những gì chúng ta cần. Nó có 2 biến đầu vào:

  1. dấu thời gian bắt đầu (tôi đã sử dụngcurdate () trong ví dụ); và một
  2. số lần lặp - điều khoản chỉ định 42 lần lặp trong ví dụ, tối đa với bảng 3 chữ số x là 1000 khoảng thời gian

... có nghĩa là chúng ta có thể sử dụng sql gốc để điều khiển ví dụ từ trên xuống để tạo ra một loạt các dấu thời gian cho mỗi cặp hival lowval. Chịu đựng với tôi, sql này bây giờ hơi dài ...

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

... bây giờ có một chút kinh nghiệm về sql
LƯU Ý:việc sử dụng bảng chữ số 3 lần sẽ tạo ra khoảng cách tối đa mà nó sẽ bao gồm một chút trong hơn 6 ngày



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu key_len của MySQL trong Tuyên bố Giải thích

  2. Làm thế nào để cập nhật trên tầng trong MySQL?

  3. Làm thế nào Phiếu thưởng WooCommerce được lưu trữ trong Cơ sở dữ liệu?

  4. Cách triển khai cơ sở dữ liệu Chamilo MySQL để có tính khả dụng cao

  5. mysql:kết nối bị từ chối khi cố gắng kết nối với localhost bằng IP từ xa