SQL查询求助:计算各timestamp对应的累计count值
实现截至每个时间点的累计count求和
问题分析
你原来的SQL用GROUP BY只是对每个时间点的count单独求和(你的数据里每个时间点只有一条记录,所以SUM(count)其实等于原count值),根本没实现累计求和的逻辑。要得到截至每个时刻的累计值,有两种常用方法:
方法1:使用窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等现代数据库)
直接用SUM() OVER(ORDER BY Timestamp)窗口函数,它会按照时间顺序,逐行计算截至当前行的累计和:
SELECT SUM(count) OVER(ORDER BY Timestamp) AS cumulative_count, Timestamp FROM your_table WHERE Timestamp > NOW() - INTERVAL 2 HOUR ORDER BY Timestamp;
执行后就能得到你要的结果:
cumulative_count Timestamp 1 10:05 3 10:06 6 10:07 7 10:08 9 10:09 12 10:10
方法2:自连接(适用于不支持窗口函数的老版本数据库)
通过将表与自身连接,筛选出所有时间小于等于当前行时间的记录,再分组求和:
SELECT SUM(t1.count) AS cumulative_count, t1.Timestamp FROM your_table t1 JOIN your_table t2 ON t2.Timestamp <= t1.Timestamp WHERE t1.Timestamp > NOW() - INTERVAL 2 HOUR GROUP BY t1.Timestamp ORDER BY t1.Timestamp;
这个方法的逻辑是:对每个t1的时间点,把所有t2中时间更早或相同的记录的count加起来,得到累计值。
内容的提问来源于stack exchange,提问作者Ylana
相关产品推荐
相关产品推荐

