MySQL Query从数据库中每个间隔只获得一个条目

问题描述 投票:0回答:1

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

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,但这只适用于每小时。我也在努力确保查询返回该小时的最近条目PER PERSON。

任何帮助将不胜感激。

mysql greatest-n-per-group
1个回答
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 
© www.soinside.com 2019 - 2024. All rights reserved.