2010-05-08 41 views
20

Tôi có hệ thống giám sát thu thập dữ liệu cứ sau mỗi giây (n ~ = 10 nhưng thay đổi). Tôi muốn tổng hợp dữ liệu được thu thập theo khoảng thời gian 15 phút. Có cách nào để corral cột dấu thời gian vào khối 15 phút để cho phép nhóm để làm việc?Truy vấn mysql nhóm theo khoảng thời gian 15 phút

Trả lời

41
SELECT FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey 
FROM  table 
GROUP BY timekey; 
+3

Không nên là «UNIX_TIMESTAMP (dấu thời gian)/(15 * 60)' trong vài phút? –

+1

Vâng, cảm ơn bạn đã sửa @Alexander và @nickf. – unutbu

+2

Tôi không nghĩ rằng ROUND là đúng chức năng nên được sử dụng ở đây. DIV phù hợp hơn. 'UNIX_TIMESTAMP (dấu thời gian) DIV (15 * 60)' Vì CHỌN VÒNG (1.8), VÒNG (2.1) sẽ rơi vào cùng một đoạn, mặc dù chúng không nên. Tham khảo: http://stackoverflow.com/a/3086470/412786 – tzzzoz

4

thích ứng của phương pháp 1) dưới đây:

select Round(date_format(date, "%i")/(15*60)) AS interval 
from table 
group by interval 

thích ứng của phương pháp 3) dưới đây:

SELECT Round(Convert(substring(date_column, 14, 2), UNSIGNED)/(15*60)) AS interval /* e.g. 2009-01-04 12:20:00 */ 
FROM table 
GROUP BY interval; 

Một vài phương pháp tôi đã tìm thấy here:

1)

select date_format(date, "%W") AS `Day of the week`, sum(cost) 
from daily_cost 
group by `Day of the week` 
order by date_format(date, "%w") 

2)

select count(*) as 'count', 
    date_format(min(added_on), '%Y-%M-%d') as 'week commencing', 
    date_format(added_on, '%Y%u') as 'week' 
from system 
where added_on >= '2007-05-16' 
group by week 
order by 3 desc; 

3)

SELECT substring(postdate, 1,10) AS dd, COUNT(id) FROM MyTable GROUP BY dd; 

(Cũng ở đây: http://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/)

EDIT: Tất cả các giải pháp sẽ thực hiện tốt trên một bảng với một số lượng lớn hồ sơ.

+0

cũng - bạn sẽ thích ứng với các nhóm này theo phạm vi 15 phút như thế nào? – nickf

+0

Cách tương tự như ~ unutbu đã làm. Nhưng ông đã nhanh hơn :-) –

8

Hãy thử điều này, nhóm các hồ sơ của khoảng 15 phút, bạn có thể thay đổi 15 * 60 đến khoảng thời gian trong giây bạn cần

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename 
group by intervals 
+0

Tôi thích cách tiếp cận này nhiều nhất vì nó giữ khoảng thời gian phút là một trong những cột imo làm cho nó dễ đọc hơn. Cảm ơn. – MrB

+0

Điều này cũng giúp tôi! Cảm ơn. Cần nó trong nhiều giờ vì vậy tôi đã thay đổi (15 * 60) thành (60 * 60) – plocks

+0

Điều này không có tác dụng nếu các bản ghi chứa nhiều ngày, vì sau đó tất cả các bản ghi cùng thời gian trong các ngày được nhóm lại. – hepabolu

0

này làm việc cho tôi

mysql> **SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60));** 
+---------------------------------------------------------------------+ 
| FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())- UNIX_TIMESTAMP(NOW())%(15*60)) | 
+---------------------------------------------------------------------+ 
| 2012-02-09 11:15:00             | 
+---------------------------------------------------------------------+ 
1 row in set (0.00 sec) 
4

tôi bắt đầu với câu trả lời được đưa ra ở trên bởi unutbu nhưng không nhận được những gì tôi cần và phải thêm một chút vào nó.

Select Created, from_unixtime(FLOOR(UNIX_TIMESTAMP(Created)/(15*60))*(15*60)) GroupTime, COUNT(*) as Cnt FROM issue i GROUP BY GroupTime

Mã này chia bởi 900 giây trong một khoảng 15 phút sau đó tầng giá trị và nhân đôi nó lại lên 900, về cơ bản làm tròn xuống đến thặng dư 15 phút gần nhất.

2

Theo dõi các nhóm truy vấn hàng và tạo dấu thời gian trong khoảng thời gian 15 phút.

Select concat(date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))as created_dt_new from table_name group by created_dt_new 


E.g Timestamps
2016-11-09 13:16:29
2016-11-09 13:16:49
2016-11-09 13:17:06
2016-11-09 13: 17:26
2016-11-09 13:18:24
2016-11-09 13:19:59
2016-11-09 13:21:17

đang nhóm lại thành 2016 -11-09 13:30:00

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    Giới hạn trên khoảng thời gian tối đa 15 phút gần nhất. ví dụ 00:10 -> 12:15

  2. concat(date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    Tạo một dấu thời gian lấy ngày từ các lĩnh vực dấu thời gian.

Các vấn đề liên quan