我正在尝试在SQLite中执行值的累加总和。最初,我只 需要对单个列求和并获得代码 column and had the code
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语句,不如使用 连接并写以下内容会更好
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才能给我正确的答案?
JOIN
您可能会得到我所说的迷你笛卡尔积:您的Date值可能不是唯一的,并且由于进行自我联接,您正在获得每个非唯一值的匹配项。分组后Date,结果将相应地相乘。
Date
为了解决这个问题,联接的左侧必须去除重复的日期。一种方法是从表中导出唯一日期表:
SELECT DISTINCT Date FROM MyTable
and use it as the left side of the join:
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.MyColumn
t.Date
就本示例而言,我假设您实际上是在说t.Date,因此,如上所述,我相应地替换了该列。如果我的假设不正确,请澄清。