所以我过去一周一直在研究这个问题并且学习。我习惯了SQL Server而不是SQLite。我现在理解 RowId ,如果我有自己的“id”列(为方便起见),它实际上会使用 RowId 。我已经使用ROW_NUMBER在SQL Server中运行了总计,但这似乎不是SQLite的选项。最有用的帖子是......
How do I calculate a running SUM on a SQLite query?
我的问题是,只要我有数据,我将继续添加到表的“底部”,它就可以工作。我说“底部”而不是底部,因为我的数据显示总是根据其他一些列(例如一个月)进行排序。换句话说,如果我为一个缺失的月份插入一个新记录,它将插入一个更高的“id”(又名_RowId“)。我那个月以下的运行总数现在需要反映所有后续月份的这个新数据。这意味着我无法通过“id”订购。
使用SQL Server,ROW_NUMBER负责我的排序,因为在select我使用的地方a.id> running.id,我会用a.rownum> running.rownum
这是我的表
CREATE TABLE `Test` (
`id` INTEGER,
`month` INTEGER,
`year` INTEGER,
`value` INTEGER,
PRIMARY KEY(`id`)
);
这是我的查询
WITH RECURSIVE running (id, month, year, value, rt) AS
(
SELECT id, month, year, value, value
FROM Test AS row1
WHERE row1.id = (SELECT a.id FROM Test AS a ORDER BY a.id LIMIT 1)
UNION ALL
SELECT rowN.id, rowN.month, rowN.year, rowN.value, (rowN.value + running.rt)
FROM Test AS rowN
INNER JOIN running ON rowN.id = (
SELECT a.id FROM Test AS a WHERE a.id > running.id ORDER BY a.id LIMIT 1
)
)
SELECT * FROM running
我可以订购我的CTE,其年份,月份,ID与上面链接的原始示例中的建议类似。但是,除非我错了,示例解决方案依赖于已按年,月,id排序的表中的记录。如果我插入较早的“月份”是正确的,那么它将会中断,因为“id”将具有所有_RowId_s的最大值。
感谢有人可以让我直截了当。