我尝试构建一个按时间间隔(即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,其中包含一些可用作示例的数据。
有人有任何建议吗?
答案 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
遗憾的是,只有在降序排序时才会生效并产生冗余行(第一行无法比较)但是根据我的测试,此行不是必需的,在读取数据时可以忽略。
如果有人有任何其他解决方案会有用吗?