按 15 分钟间隔对 mysql 查询进行分组

Posted

技术标签:

【中文标题】按 15 分钟间隔对 mysql 查询进行分组【英文标题】:Group mysql query by 15 min intervals 【发布时间】:2011-02-17 03:36:17 【问题描述】:

我有一个监控系统,它每 n 秒收集一次数据(n 大约为 10,但会有所不同)。我想以 15 分钟的间隔汇总收集到的数据。有没有办法将时间戳值合并为 15 分钟的块以允许分组工作?

【问题讨论】:

【参考方案1】:
SELECT   FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM     table
GROUP BY timekey;

【讨论】:

不应该是UNIX_TIMESTAMP(timestamp)/(15 * 60) 几分钟吗? 我不认为 ROUND 是应该在这里使用的正确函数。 DIV 更合适。 UNIX_TIMESTAMP(timestamp) DIV (15 * 60) 因为 SELECT ROUND(1.8), ROUND(2.1) 将属于同一段,尽管它们不应该。参考:***.com/a/3086470/412786 ROUND 给出的 15 分钟间隔与 DIV 不同,但两者都产生 15 分钟的间隔。 我认为使用 FLOOR 会比 ROUND 函数产生更好的结果:00:00:00 将与 00:14:59 的值分组。我认为这是一个更自然的概念。 我会使用 CEIL。如果您使用 10 分钟间隔,则 FLOOR 给出 5,15,25 但 ceil 给出 0, 10, 20 更正确的分割【参考方案2】:

以下方法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;

我发现的一些方法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;

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

编辑:所有解决方案都将在具有大量记录的表上表现不佳。

【讨论】:

好吧 - 你将如何调整这些以按 15 分钟的范围分组? 和 ~unutbu 一样。但他更快:-)【参考方案3】:

试试这个,15分钟间隔的记录分组,你可以把15*60改成你需要的间隔秒数

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

【讨论】:

我最喜欢这种方法,因为它将分钟间隔保留为 imo 列之一,使其更具可读性。谢谢。 这对我也有帮助!谢谢。需要几个小时,所以我将 (15*60) 更改为 (60*60) 如果记录包含多个日期,这将不起作用,因为这样所有跨日期具有相同时间的记录都会被分组。 @BenG:非常感谢。这只是给了我需要的结果。【参考方案4】:

这对我有用

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)

【讨论】:

【参考方案5】:

我从 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 分钟增量。

【讨论】:

【参考方案6】:

以下查询对行进行分组并以 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

    sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60))) 上限时间到最近的 15 分钟间隔。例如 12:10 -> 12:15

    concat( date(created_dt) , ' ', sec_to_time(time_to_sec(created_dt)- time_to_sec(created_dt)%(15*60) + (15*60))) 从时间戳字段中获取日期生成时间戳。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

这对我有用

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;

【讨论】:

【参考方案9】:

将“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;

【讨论】:

【参考方案10】:

我对 GROUP BY 不满意。

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

【讨论】:

以上是关于按 15 分钟间隔对 mysql 查询进行分组的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDb 中按 15 分钟的时间间隔对结果进行分组

如何在 Oracle SQL 上进行查询以获取时间间隔,按特定字段分组

有没有办法在 DuckDB 中按 15 分钟的间隔进行分组?

按数据区间分组

按 1 分钟间隔分组操作链 sql BigQuery

在 Oracle SQL 中按时间间隔聚合数据