【问题标题】:SQLite: Batch aggregation with insertSQLite:使用插入进行批量聚合
【发布时间】:2019-09-18 23:02:33
【问题描述】:

我想做以下事情:

cur.execute("SELECT key, SUM(val) FROM table GROUP BY key")

cur.executemany("INSERT INTO table_sums VALUES(?,?)",(row for row in cur))

如果可能,在单个 SQLite 语句中进行批处理,也就是说,它只对一些键、插入进行求和,直到所有键都被处理为止。

显然我现在正在使用 Python,但由于我要求一个语句(如果存在),我认为这无关紧要。如果它不存在,也许 Python 中有一个有效的(!)解决方法?

编辑:为了避免 SELECT WHERE 查询,实际上最好不要为键的子集生成完整的总和,而是只对前 n 行求和并存储到目前为止的总和,然后继续下一个n...

【问题讨论】:

    标签: python select sqlite insert aggregate


    【解决方案1】:

    这两个 SQL 可以使用 temporary view 组合成一个。

    WITH tempsums as 
    (SELECT key,sum(value) from table 
    GROUP by key
    where key in :batch)
    INSERT INTO total_sums SELECT * from tempsums)
    

    【讨论】:

    • 基本上,WITH tmp_sums AS (SELECT key, SUM(value) FROM table GROUP BY key) INSERT INTO table_sums SELECT * FROM tmp_sums);?因为WHERE key IN 部分太贵了。没有WHERE有什么办法吗?
    • 示例 WHERE 是“批处理”的代理。您可以在没有 WHERE 的情况下执行此操作,它会插入所有这些。我不清楚你要克服什么障碍。
    • 我想对键进行排序,然后通过第一个 m 不同的键并插入(不更新)是最快的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2010-10-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多