我有一个具有此结构的表和一些示例值:
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,但这只能每小时进行一次。我还在努力确保查询返回该小时的“最近的人”条目。
任何帮助将不胜感激。
答案 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