首页 > 解决方案 > MySql GROUP BY 时间戳间隔,其中间隔已过

问题描述

是否可以仅选择间隔已过的记录?

例如,在带有 group by 的选择中,对于这样的表: TABLE (timestamp(timestamp), name(VARCHAR))

timestamp            name  
-------------------  ----  
2010-11-16 10:30:01  John  
2010-11-16 10:30:02  John  
2010-11-16 10:30:03  John  
2010-11-16 10:30:31  John  
2010-11-16 10:30:32  John  
2010-11-16 10:30:33  John 

查询:

SELECT max(timestamp), name, count(name) 
FROM table 
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 30, name

结果:

timestamp            name       count(name)  
    -------------------  ----   -----------
    2010-11-16 10:30:03  John     3 
    2010-11-16 10:30:33  John     3

这将按以下记录分组:

hour:minute:00 to hour:minute:29 并来自: hour:minute:30 to hour:minute:59

如果我在 进行查询10:30:55,我只想获取从前一个时间间隔10:30:0010:30:29(和更早)的记录,而不需要在10:30:30到之间添加记录10:30:59

换句话说,如果我在某个时间间隔内查询,则在显示记录之前等待它通过。请注意,查询可能不会总是在同一秒 ( 10:30:55)10:30:51或其他任何时间进行。

所以该子句的结果应该是:

        timestamp            name       count(name)  
        -------------------  ----   -----------
        2010-11-16 10:30:03  John     3 

例如,如果它是在制造的2010-11-16 10:30:55

标签: mysqlgroup-bytimestamp

解决方案


SQL 演示

SELECT max(timestamp), name, count(name) 
FROM table1
WHERE UNIX_TIMESTAMP(timestamp) DIV 30 < 
      UNIX_TIMESTAMP('2010-11-16 10:30:55') DIV 30
GROUP BY UNIX_TIMESTAMP(timestamp) DIV 30, name
;

我对当前日期进行了硬编码,'2010-11-16 10:30:55'但您可以改用NOW()函数

输出

|       max(timestamp) | name | count(name) |
|----------------------|------|-------------|
| 2010-11-16T10:30:03Z | John |           3 |

如果您只想要最后一组,请添加

ORDER BY UNIX_TIMESTAMP(timestamp) DIV 30 DESC
LIMIT 1

推荐阅读