我正在尝试在 SQLite 中执行值的累积总和。我最初只需要对单列求和并获得代码
SELECT
t.MyColumn,
(SELECT Sum(r.KeyColumn1) FROM MyTable as r WHERE r.Date < t.Date)
FROM MyTable as t
Group By t.Date;
效果很好。
现在我想将其扩展到更多列
KeyColumn2
和 KeyColumn3
说。而不是添加更多 SELECT
声明我认为最好使用连接并写下以下内容SELECT
t.MyColumn,
Sum(r.KeyColumn1),
Sum(r.KeyColumn2),
Sum(r.KeyColumn3)
FROM MyTable as t
Left Join MyTable as r On (r.Date < t.Date)
Group By t.Date;
然而,这并没有给我正确的答案(相反,它给出了比预期大得多的值)。为什么会这样,我该如何纠正
JOIN
给我正确的答案?
最佳答案
你可能会得到我所说的迷你- Cartesian products : 您的 Date
值可能不是唯一的,并且作为自联接的结果,您将获得每个非唯一值的匹配项。按 Date
分组后结果只是相应地相乘。
为了解决这个问题,连接的左侧必须去掉重复的日期。一种方法是从您的表中导出唯一日期表:
SELECT DISTINCT Date
FROM MyTable
并将其用作连接的左侧:
SELECT
t.Date,
Sum(r.KeyColumn1),
Sum(r.KeyColumn2),
Sum(r.KeyColumn3)
FROM (SELECT DISTINCT Date FROM MyTable) as t
Left Join MyTable as r On (r.Date < t.Date)
Group By t.Date;
我注意到你使用了
t.MyColumn
在 SELECT 子句中,而您的分组是按 t.Date
.如果这是故意的,您可能会依赖那里的未定义行为,因为 t.MyColumn
值可能会在同一个 t.Date
中的(潜在)许多中任意选择团体。出于本示例的目的,我假设您实际上是指
t.Date
,因此,我相应地替换了该列,如上所示。如果我的假设不正确,请澄清。
关于sql - SQLite 中的累积求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21382766/