2017-03-01 54 views
0

我試圖找出一種方法來縮小表的大小,通過合併類似條目來增加到驚人的大小。我已經得到了一個工作的「分組依據」查詢,按照我的意願捲起數據,但我不確定如何刪除現有條目並根據該選擇語句插入新數據。我想最直接的方法是運行select,將這些結果保存到內存中,刪除表條目,然後插入合併條目。但這似乎效率低下,會使用大量的內存,希望也許有一種方法來執行一些SQL魔法,並使這一次發生。SQL組按現有行刪除它們並按組結果插入按結果

這是我的 '集團通過' 選擇:

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; 
+0

什麼是您的關係型數據庫? –

+1

如果您收到大量不需要的重複項,您應該查看將條目添加到user_usage表的 – SpacePhoenix

+0

添加表模式的代碼邏輯。 – McNets

回答

1

一個可能的解決方案是使用另一個彙總表(例如:user_usage_aggregated)。 定期運行您的查詢並將輸出寫入聚合表。然後從user_usage中刪除原始數據。

如果你想總結數據,你需要更新聚合表,而不是插入到它。