MySQL查询从数据库中每个间隔仅获取一个条目

时间:2019-04-12 13:05:20

标签: mysql greatest-n-per-group

我有一个具有此结构的表和一些示例值:

ID | created | value | person
1  |  1      |   5   | 1
2  |  2      |   2   | 2
3  |  3      |   3   | 3
4  |  4      |   5   | 1
5  |  5      |   1   | 2
6  |  6      |   32  | 3
7  |  7      |   9   | 1
8  |  8      |   34  | 2
10 |  9      |   25  | 3
11 |  11     |   53  | 1
12 |  12     |   52  | 2
13 |  13     |   15  | 3
... etc

创建的列将带有时间戳。即像“ 1555073978”这样的数字。我只是使它递增,以证明时间戳很少相同。

因此,按创建时间存储每个人的值。每分钟都会添加值。一周后,这张桌子很大。因此,当我执行查询以绘制图形时,由于数据集非常庞大,PHP耗尽了内存。

所以我要寻找的是在这样的表上执行查询的一种简便方法,这样我就可以以较小的间隔获取值。

我将如何查询该表,以便得到:  -每个间隔每个人只有一个值  -间隔应为15分钟,30分钟,60分钟等(即查询中的参数)

我从一种方法开始,但是不想花太多时间,以防万一我错过了一种更简单的方法。我的方法涉及将时间戳转换为YEAR-MONTH-DAY-HOUR,但这只能每小时进行一次。我还在努力确保查询返回该小时的“最近的人”条目。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

假设您创建的列是一个时间戳记,并且您希望每15分钟尝试一次人的最大值

select  person, max(value)
from my_table 
group by person, FLOOR(UNIX_TIMESTAMP(created )/(15 * 60))

但是如果您不需要unix_timestamp

然后

group by person, FLOOR(created /(15 * 60)) 

如果要获取人员和间隔的最新值,则可以使用

select  * from my_table m 
inner join  (
  select  person, max(created) max_created 
  from my_table 
  group by person, FLOOR(UNIX_TIMESTAMP(created )/(15 * 60))
) t on t.person = m.person and t.max_created  = m.created