我有一个包含带时间戳的聚合结果的表 - 这意味着每次每个结果是到目前为止的总数:
date | time | ip | result
---------------------------------------
2011-03-01 | 10:00 | 10.0.0.1 | 200
2011-03-01 | 11:00 | 10.0.0.1 | 303
2011-03-01 | 12:00 | 10.0.0.1 | 415
2011-03-01 | 13:00 | 10.0.0.1 | 628
2011-03-01 | 10:00 | 10.0.0.2 | 198
2011-03-01 | 11:00 | 10.0.0.2 | 234
2011-03-01 | 12:00 | 10.0.0.2 | 373
2011-03-01 | 13:00 | 10.0.0.2 | 512
Run Code Online (Sandbox Code Playgroud)
我正在尝试制定一个查询,它将获得每个时间范围之间的增量:
date | time | ip | diff
---------------------------------------
2011-03-01 | 10:00 | 10.0.0.1 | 200
2011-03-01 | 11:00 | 10.0.0.1 | 103
2011-03-01 | 12:00 | 10.0.0.1 | 112
2011-03-01 | 13:00 | 10.0.0.1 | 213
2011-03-01 | 10:00 | 10.0.0.2 | 198
2011-03-01 | 11:00 | 10.0.0.2 | 36
2011-03-01 | 12:00 | 10.0.0.2 | 139
2011-03-01 | 13:00 | 10.0.0.2 | 139
...
Run Code Online (Sandbox Code Playgroud)
因此每个日期/ ip分组的每一行都会减去它之前的那一行(或0).有什么简单的方法吗?谢谢.
vbe*_*nce 10
这是一个没有变量的解决方案.我假设你在一个名为的表中有你的initail数据thetable.
SELECT date, time, ip,
result - IFNULL( (
SELECT MAX( result )
FROM thetable
WHERE ip = t1.ip
AND ( date < t1.date
OR date = t1.date AND time < t1.time )
) , 0) AS diff
FROM thetable AS t1
ORDER BY ip, date, time
Run Code Online (Sandbox Code Playgroud)
这里我们通过子选择获得前一个值(result前一个时间戳的最大值ip).IFNULL如果这是第一个值,则给出0,因此初始结果显示正确.
我还建议将以下索引添加到thetable:
CREATE INDEX sort1 ON thetable (ip, date, time);
Run Code Online (Sandbox Code Playgroud)