SQLite在不依赖RowId序列的情况下运行总计

时间:2018-01-13 20:08:42

标签: sqlite common-table-expression

所以我过去一周一直在研究这个问题并且学习。我习惯了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的最大值。

感谢有人可以让我直截了当。

0 个答案:

没有答案