小编典典

SQLite中的累加值

sql

我正在尝试在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;

效果很好。

现在,我想将其扩展到更多列KeyColumn2KeyColumn3说。我认为
与其添加更多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才能给我正确的答案?


阅读 371

收藏
2021-05-23

共1个答案

小编典典

您可能会得到我所说的迷你笛卡尔积:您的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.MyColumnSELECT子句中使用过,而您的分组依据是t.Date。如果这是故意的,那么您可能依赖于未定义的
行为,因为该t.MyColumn值可能会在同一t.Date组的(可能)许多值中任意选择。

就本示例而言,我假设您实际上是在说t.Date,因此,如上所述,我相应地替换了该列。如果我的假设不正确,请澄清。

2021-05-23