sql - SQLite 中的累积求和值

标签 sql sqlite

我正在尝试在 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给我正确的答案?

最佳答案

你可能会得到我所说的迷你- 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/

相关文章:

mysql - 将 INTERSECT 语句转换为 MySQL

python - 使用 Python 将 JSON 数据插入 SQL Server

iphone - 升级操作系统应用程序时迁移 sqlite 数据库有哪些选项?

c# - 如何在 Xamarin 中使用数据库项填充 ListView?

java - 为什么我使用 result.getInt(2)/result.getInt(3) 和 result.getString(0)

c# - Web 引用中断 SSIS 包

sql - 查找最近的逾期日期

用于搜索具有特定标签的项目的 MySQL 查询

android - 在 Android 2.2 中复制 SQLite 数据库时出现问题

sqlite - 调试 MonoTouch 时 iOS 模拟器上的错误 - 仅安装 4.3 时出现 3.2 SDK 错误?