簡體   English   中英

按 15 分鍾間隔對 mysql 查詢進行分組

[英]Group mysql query by 15 min intervals

我有一個監控系統,每 n 秒收集一次數據(n 大約為 10,但會有所不同)。 我想以 15 分鍾的間隔匯總收集到的數據。 有沒有辦法將時間戳值合並為 15 分鍾的塊以允許分組工作?

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

試試這個,以 15 分鍾為間隔的記錄分組,你可以將 15*60 更改為你需要的以秒為單位的間隔

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

方法 1) 的改編如下:

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

方法 3) 的改編如下:

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;

我在這里找到了一些方法:

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;

(也在這里: http ://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/)

編輯:所有解決方案都將在具有大量記錄的表上表現不佳。

我從 unutbu 上面給出的答案開始,但沒有得到我需要的東西,不得不添加一點。

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

此代碼在 15 分鍾內除以 900 秒,然后將該值取底並乘以 900,基本上舍入到最接近的 15 分鍾增量。

以下查詢對行進行分組並以 15 分鍾的間隔創建時間戳。

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 


例如時間戳
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

被分組為 2016-11-09 13:30:00

  1. sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60)))
    上限時間到最近的 15 分鍾間隔。 例如 12: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)))
    從時間戳字段中生成時間戳。

Unix 時間戳:使用以下方法之一將它們降到最近的 15 分鍾:

timestamp div (15 * 60) * (15 * 60) -- div is integer division operator
timestamp - timestamp % (15 * 60)

日期時間:假設數據類型沒有小數秒,使用以下方法將它們降到最接近的 15 分鍾:

date - INTERVAL EXTRACT(SECOND FROM date) SECOND - INTERVAL EXTRACT(MINUTE FROM date) % 15 MINUTE

DBFiddle

這對我有用

SELECT CONCAT (
        YEAR(transactionDate)
        ,'-'
        ,MONTH(transactionDate)
        ,'-'
        ,DAYOFMONTH(transactionDate)
        ,' '
        ,HOUR(transactionDate)
        ,':'
        ,((floor((MINUTE(transactionDate) / 15)) + 1) * 15) - 1
        ,':59'
        ) AS tmp1
    ,count(*)
FROM tablename
GROUP BY tmp1 limit 20;

將“15”更改為您想要的任何間隔。

select count(*),
CONCAT(HOUR(col_date),":",(MINUTE(create_date) div 15)*15) as date
from tablename
GROUP BY date
ORDER BY col_date ASC;

我對 GROUP BY 不滿意。

SELECT   datetime
FROM     table
WHERE MOD(MINUTE(TIME(datetime)),15) = 0 AND SECOND(TIME(datetime)) = 0;

這對我有用

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM