SQLite中按LotId过滤的累计求和视图实现问询
按LotId分组计算累计余额的视图改造
我有一张仅允许追加写入的Operation表,包含以下字段:
- Id:INTEGER类型,自增主键
- LotId:INTEGER类型,外键
- Amount:INTEGER类型
为了在插入新行时实时反映余额,我原本创建了Ledger视图,语句如下:
CREATE VIEW IF NOT EXISTS "Ledger" ("OperationId", "Balance") AS SELECT "Id", SUM("Amount") OVER (ROWS UNBOUNDED PRECEDING) FROM "Operation";
但当前视图是对所有行全局累计求和,现在需要修改为按LotId分组,仅累加同LotId下的Amount值,最终要实现如下效果:
Operation表数据
| Id | LotId | Amount |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 2 | 5 |
| 3 | 1 | -7 |
期望的Ledger视图结果
| OperationId | LotId | Balance |
|---|---|---|
| 1 | 1 | 10 |
| 2 | 2 | 5 |
| 3 | 1 | 3 |
修改后的视图创建语句
只需在窗口函数的OVER子句中添加PARTITION BY "LotId",同时补充排序逻辑和必要字段,实现按LotId分组累计:
CREATE VIEW IF NOT EXISTS "Ledger" ("OperationId", "LotId", "Balance") AS SELECT "Id" AS "OperationId", "LotId", SUM("Amount") OVER (PARTITION BY "LotId" ORDER BY "Id" ROWS UNBOUNDED PRECEDING) AS "Balance" FROM "Operation";
关键说明
PARTITION BY "LotId":将数据按LotId分割为独立分组,每个分组内单独计算累计和ORDER BY "Id":确保按Operation的自增Id顺序累加(仅追加表的Id顺序即插入顺序,符合余额计算的时序逻辑)- 新增
LotId字段到视图中,让结果与示例输出匹配,逻辑更清晰
内容的提问来源于stack exchange,提问作者wojas
相关产品推荐
相关产品推荐

