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

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

【问题讨论】:

    标签: mysql sql datetime group-by timestamp


    【解决方案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) 将属于同一段,尽管它们不应该。参考:stackoverflow.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

        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)))
          从时间戳字段中获取日期生成时间戳。

        【讨论】:

          【解决方案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;
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-01-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多