按时间间隔分组,包括下一个开始?

时间:2016-10-13 11:40:58

标签: mysql sql time

我尝试构建一个按时间间隔(即30分钟)对数据进行分组的查询,然后计算每个组中第一行和最后一行之间的差异。

select (max(v) - min(v)) as x, from_unixtime(FLOOR(UNIX_TIMESTAMP(d)/(30*60))*(30*60)) as timeKey from y group by timeKey

以上内容正确地以30分钟的方式返回我的数据但是我需要以某种方式调整它以包含12:00 and 12:30而不是12:00 and 12:29之间的所有内容。

我曾尝试使用以下内容,但在分配值时无法使用max

select max(v) - @lastV, from_unixtime(FLOOR(UNIX_TIMESTAMP(d)/(30*60))*(30*60)) as timeKey, @lastv := v from `test`, (select @lastV:=0) lastV group by timeKey

http://sqlfiddle.com/#!9/e8d74/4

我创建了上面的SQL Fiddle,其中包含一些可用作示例的数据。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

我今天早上想出了一个潜在的解决方案:

select *, IF(@lastV, @lastV - minV, 0) as `usage`, @lastV := minV from ( select min(v) as minV, max(v) as maxV, from_unixtime(FLOOR(UNIX_TIMESTAMP(d)/(30*60))*(30*60)) as timeKey from `test` group by timeKey order by timeKey desc ) items, (select @lastV:=0) lastV

http://sqlfiddle.com/#!9/e8d74/18/0

遗憾的是,只有在降序排序时才会生效并产生冗余行(第一行无法比较)但是根据我的测试,此行不是必需的,在读取数据时可以忽略。

如果有人有任何其他解决方案会有用吗?