SQLite中如何实现行累加并生成累计列total_col
在SQLite中实现累计求和生成total_col列
要搞定这个需求其实很简单,分两种情况给你说,优先推荐用窗口函数,老版本SQLite也有替代方案:
方法一:用窗口函数(推荐,SQLite 3.25.0+)
从SQLite 3.25.0版本开始,官方支持了窗口分析函数,这是实现累计求和最简洁高效的方式。直接用SUM() OVER()就能按顺序累加:
SELECT date, col_1, SUM(col_1) OVER (ORDER BY date) AS total_col FROM your_table;
原理说明
SUM(col_1) OVER (ORDER BY date)的作用是:按照date列的排序顺序,逐行计算从第一行到当前行的col_1总和,完全匹配你要的"第一行值依次与后续行累加"的效果。
方法二:子查询兼容老版本SQLite(3.25.0以下)
如果你的SQLite版本比较老,不支持窗口函数,可以用子查询来实现:
SELECT t1.date, t1.col_1, (SELECT SUM(col_1) FROM your_table t2 WHERE t2.date <= t1.date) AS total_col FROM your_table t1 ORDER BY t1.date;
原理说明
对于每一行t1,子查询会筛选出所有日期小于等于当前行日期的记录,然后计算这些记录的col_1总和,最终得到累计值。不过这种方法的效率会比窗口函数低,数据量大的时候会更明显,所以能升级SQLite版本的话优先用第一种方法。
示例验证
用你给出的测试数据来验证:
先创建表并插入数据:
CREATE TABLE test_data ( date TEXT, col_1 INTEGER ); INSERT INTO test_data (date, col_1) VALUES ('jan-1', 10), ('jan-2', 25), ('jan-3', 33), ('jan-4', -12), ('jan-5', 20);
执行第一种方法的查询后,得到的结果就是你想要的:
date | col_1 | total_col
jan-1 | 10 | 10
jan-2 | 25 | 35
jan-3 | 33 | 68
jan-4 | -12 | 56
jan-5 | 20 | 76
内容的提问来源于stack exchange,提问作者shkhoo
相关产品推荐
相关产品推荐

