【问题标题】:Cumulative Summing Values in SQLiteSQLite 中的累积求和值
【发布时间】:2014-01-28 15:52:42
【问题描述】:

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

效果很好。

现在我想将其扩展到更多列 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 以给我正确的答案?

【问题讨论】:

  • 请发布正确的代码。在加入和求和之前,“SELECT T.* ... GROUP BY T.DATE”不可能工作,因为您只按日期分组,其他字段可能不同。
  • 是的,我写这个只是为了清楚地表明SELECT 也将依赖于原始表。但是这是不正确的,所以我会改变。但我认为这与实际问题无关。

标签: sql sqlite


【解决方案1】:

您可能会得到我所说的 mini-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;

我注意到你在 SELECT 子句中使用了t.MyColumn,而你的分组是t.Date。如果这是故意的,那么您可能依赖于未定义的行为,因为t.MyColumn 值可能会在同一t.Date 组中的(可能)许多人中任意选择。

出于本示例的目的,我假设您实际上是指t.Date,因此,我相应地替换了该列,如上所示。如果我的假设不正确,请澄清。

【讨论】:

  • 谢谢安德烈,非常好的答案,这解决了。
【解决方案2】:

您的加入不起作用,因为他会找到比您的子选择更多的加入可能性。

连接正在爆炸您的表。

子选择对日期低于当前记录的所有记录进行汇总。

只要日期低于当前记录,连接就会多次连接每一行。这意味着单个记录可以执行与日期较低的记录一样多的连接。这会导致多条记录。最后是更高的 SUM。

如果您想要多列的总和,则必须使用 3 个子查询或定义一个唯一连接。

【讨论】:

  • 好的,我明白你在说什么。我将如何创建一个独特的连接?
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2021-01-07
  • 1970-01-01
相关资源
最近更新 更多