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

Dữ liệu trung bình cho mỗi 5 phút trong khoảng thời gian nhất định

Nhóm thành các khoảng thời gian

Bạn nên sử dụng nhóm group by để tạo một nhóm cho mỗi khoảng thời gian mà bạn muốn lấy trung bình.

select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500

Điều này tận dụng thực tế là ngày và giờ có thể được chuyển đổi ngầm thành một số, sau đó sẽ có định dạng YYMMDDhhmmss . Chia một số như vậy cho 100 sẽ chia thành giây và tương tự chia cho 500 sẽ thu được một số duy nhất cho mỗi khoảng thời gian 5 phút.

Cột bổ sung mà tôi đã chọn sẽ cung cấp cho khoảng thời gian giữa:bất kỳ thời gian nào từ khoảng thời gian (ở đây chọn mức tối thiểu, nhưng nó không thực sự quan trọng), được chuyển thành số khoảng thời gian 5 phút đó, trở lại thành ngày và giờ số, và sau đó thêm hai phút rưỡi. Bạn có thể sử dụng cú pháp tương tự để tính toán đầu (chỉ cần để lại + 230 hết) hoặc (bao gồm) kết thúc (+ 459 ) của khoảng thời gian.

Đã kiểm tra bằng cách sử dụng sqlfiddle .

Xử lý cuối dải

Lưu ý rằng BETWEEN của bạn phạm vi sẽ bao gồm các hàng từ 15:30:00 nhưng không có người khác từ khoảng thời gian bắt đầu vào thời điểm đó. Có thể bạn muốn loại trừ phần cuối của phạm vi khỏi lựa chọn của mình:

where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

Tại sao bạn nhận được NULL

Về lý do tại sao truy vấn của bạn cho ra NULL :Để tính toán khoảng thời gian, bạn không đặt toàn bộ khoảng thời gian trong dấu ngoặc kép và bạn sử dụng tên số ít cho các đơn vị thời gian. Tức là

'2012-09-08 15:30:00' + INTERVAL 5 minute

Nhưng điều này chỉ đơn giản là mở rộng phạm vi thành 2012-09-08 15:35:00 và vẫn không tạo những khoảng thời gian 5 phút mà bạn muốn. Theo cách bạn viết, bạn đang cố gắng thêm hai chuỗi, điều này không thể thực hiện được trong MySQL trừ khi các chuỗi có thể được chuyển đổi thành số, trong trường hợp đó, những số đó sẽ được thêm vào.

Bạn có thể muốn sử dụng số học khoảng thời gian để tính toán kết thúc duy nhất của khoảng thời gian, tức là giây đầu tiên sau khoảng thời gian:

 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

Chỉ cần thêm 500 thay vì 230 truy vấn của tôi sẽ không hoạt động vì số kết quả có thể đại diện cho một ngày không hợp lệ trong khoảng thời gian cuối cùng của mỗi giờ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buộc MySQL trả về các bản sao từ mệnh đề WHERE IN mà không sử dụng JOIN / UNION?

  2. 500 - Đã xảy ra lỗi - Hàm DB không báo lỗi khi thêm bài viết mới trong Joomla

  3. Cần trợ giúp với truy vấn sql để tìm những thứ được gắn thẻ với tất cả các thẻ được chỉ định

  4. tìm kiếm các sản phẩm mà khách hàng đã mua cùng nhau

  5. Làm cách nào để ngăn truy vấn này in hai lần cùng một kết quả?