SQL按现有行分组、删除行和按结果插入组
我正试图找到一种方法,通过合并类似的条目来减少正在增长到惊人大小的表的大小。我得到了一个正在工作的“groupby”查询,它确实按照我的意愿汇总了数据,我只是不知道如何删除现有条目并根据select语句插入新条目。我认为最直接的方法是运行select,将这些结果保存到内存中,删除表条目,然后插入合并条目。但这似乎效率低下,而且会占用大量内存,希望有一种方法可以执行一些sql魔术,让这一切同时发生 这是我的“分组依据”选择:SQL按现有行分组、删除行和按结果插入组,sql,consolidation,Sql,Consolidation,我正试图找到一种方法,通过合并类似的条目来减少正在增长到惊人大小的表的大小。我得到了一个正在工作的“groupby”查询,它确实按照我的意愿汇总了数据,我只是不知道如何删除现有条目并根据select语句插入新条目。我认为最直接的方法是运行select,将这些结果保存到内存中,删除表条目,然后插入合并条目。但这似乎效率低下,而且会占用大量内存,希望有一种方法可以执行一些sql魔术,让这一切同时发生 这是我的“分组依据”选择: select SUM(user_in), SUM(use
select SUM(user_in),
SUM(user_out),
SUM(user_total),
name,
device_type,
device_os,
ownership,
host_name
FROM user_usage
GROUP BY name,
device_type,
device_os,
ownership,
host_name;
谢谢
如果其他任何人遇到类似情况,此函数将在非常高效的情况下完成整合:
CREATE OR REPLACE FUNCTION consolidate_user_bandwidths(
IN _tbl REGCLASS,
IN _savetime TIMESTAMP
) RETURNS void AS
$BODY$
BEGIN
EXECUTE 'CREATE TEMP TABLE user_bandwidths_temp ON COMMIT DROP AS
SELECT MAX(id) AS id, SUM(bandwidth_in) AS bandwidth_in,
SUM(bandwidth_out) AS bandwidth_out,
'''|| _savetime ||'''::timestamp AS created_at,
SUM(bandwidth_total) AS bandwidth_total, name,
device_type, device_os,
ownership, host_name
FROM '|| _tbl ||'
GROUP BY name, device_type,
device_os, ownership, host_name';
EXECUTE 'TRUNCATE TABLE '|| _tbl ||'';
EXECUTE 'INSERT INTO '|| _tbl ||' SELECT * FROM user_bandwidths_temp';
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
一种可能的解决方案是使用另一个聚合表(例如:user\u usage\u aggregated)。 定期运行查询并将输出写入聚合表。然后从用户使用中删除原始数据
如果要继续汇总数据,则需要更新聚合表,而不是插入其中。什么是RDBMs?如果获得大量不需要的重复项,则应查看代码的逻辑,该代码将条目添加到用户使用情况表添加表架构。您可以移动未查询的数据(旧数据)其中一个选项是基于查询创建临时表从实际表中删除所有现有注册表,将临时表中的所有数据插入到实际表中,然后删除临时表。但我也强烈建议您遵循@SpacePhoenix的建议,因为您在不久的将来将面临同样的问题。