【问题标题】:Complex SUM from multiple tables来自多个表的复杂 SUM
【发布时间】:2014-07-13 05:04:16
【问题描述】:

这是我的桌子:

CREATE TABLE component
                            (id INTEGER PRIMARY KEY AUTOINCREMENT,
                            name TEXT UNIQUE);

CREATE TABLE file
                            (id INTEGER PRIMARY KEY AUTOINCREMENT,
                            component_id INTEGER,
                            name TEXT UNIQUE);

CREATE TABLE function
                            (id INTEGER PRIMARY KEY AUTOINCREMENT,
                            file_id INTEGER,
                            name TEXT,
                            FOREIGN KEY(file_id) REFERENCES file(id),
                            UNIQUE(file_id, name));

CREATE TABLE version
                            (id INTEGER PRIMARY KEY AUTOINCREMENT,
                            version TEXT UNIQUE);

CREATE TABLE data
                            (id INTEGER PRIMARY KEY AUTOINCREMENT,
                            file_id INTEGER,
                            version_id INTEGER,
                            function_id INTEGER,
                            errors INTEGER,
                            ...,
                            FOREIGN KEY(file_id) REFERENCES file(id),
                            FOREIGN KEY(version_id) REFERENCES version(id),
                            FOREIGN KEY(function_id) REFERENCES function(id),
                            UNIQUE(file_id, version_id, function_id));

我需要两个查询:

  • 对文件中所有数据的 data.errors 求和。对于给定的文件 ID,我需要所有错误的总和。
  • 对特定组件内所有文件的所有函数的 data.errors 求和。
  • 所有 data.errors 必须属于最新的 version_id。

上述版本 MAX 要求示例:

DATA
id  file_id     version_id  function_id     errors
1       1           3           1           40
2       1           3           2           231
3       1           2           3           19

这里我需要它返回 ids 1,2 并忽略 3,即使它是特定功能的最新版本。它确实与属于该文件的函数的最新版本相匹配。想象一个现实世界的场景,其中一个函数从新版本的文件中删除。

唯一的要求是查询尽可能快。 数据库中的约束没有太大变化(最好什么都没有)。 如果可以在我打算使用它的 Django ORM 中做到这一点,那就太好了,但不是必需的。

【问题讨论】:

    标签: sql sqlite group-by sum django-orm


    【解决方案1】:

    文件的最新版本可以这样计算:

    SELECT MAX(version_id)
    FROM data
    WHERE file_id = ?
    

    这可以简单地插入另一个查询来获得总和:

    SELECT SUM(errors)
    FROM data
    WHERE file_id = ?
      AND version_id = (SELECT MAX(version_id)
                        FROM data
                        WHERE file_id = ?)
    

    要将其扩展到组件,需要另一个子查询来查找组件的文件:

    SELECT SUM(errors)
    FROM data
    WHERE file_id IN (SELECT id
                      FROM file
                      WHERE component_id = ?)
      AND version_id = (SELECT MAX(version_id)
                        FROM data
                        WHERE file_id IN (SELECT id
                                          FROM file
                                          WHERE component_id = ?))
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 2020-03-29
      相关资源
      最近更新 更多