2017-03-01 5 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

RDBM이란 무엇입니까? –

+1

원치 않는 중복이 많이 발생하는 경우 user_usage 테이블 – SpacePhoenix

+0

테이블 스키마에 항목을 추가하는 코드의 논리를 살펴 봐야합니다. – McNets

답변

1

가능한 솔루션은 다른 집계 테이블을 사용하는 것입니다 (예를 들어 : user_usage_aggregated). 주기적으로 쿼리를 실행하고 출력을 집계 테이블에 씁니다. 그런 다음 user_usage에서 원시 데이터를 삭제하십시오.

데이터 합계를 유지하려면 집계 테이블을 삽입하지 말고 업데이트해야합니다.