Skip to content

6.5 조건 ROLLUP

원본을 필터한 뒤 집계

조건 ROLLUP은 원본의 품질·상태 조건을 적용한 통계를 유지합니다. 이미 계산한 평균에서 불량 표본만 나중에 제거하는 것과 다릅니다. 조건에 사용한 quality 컬럼 자체가 집계 결과에 보존되는 것도 아닙니다.

1. 테이블과 두 ROLLUP 준비

CREATE TAG TABLE ch6_condition (
    name VARCHAR(32) PRIMARY KEY,
    time DATETIME BASETIME,
    value DOUBLE,
    quality INTEGER
);
CREATE ROLLUP ch6_condition_all
  ON ch6_condition(value) INTERVAL 1 MIN EXTENSION;
CREATE ROLLUP ch6_condition_good
  ON ch6_condition(value) INTERVAL 1 MIN EXTENSION WHERE quality = 1;
INSERT INTO ch6_condition VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 10.0, 1);
INSERT INTO ch6_condition VALUES ('TEMP_01', TO_DATE('2026-01-01 00:00:30', 'YYYY-MM-DD HH24:MI:SS'), 20.0, 1);
INSERT INTO ch6_condition VALUES ('TEMP_01', TO_DATE('2026-01-01 00:01:00', 'YYYY-MM-DD HH24:MI:SS'), 30.0, 1);
INSERT INTO ch6_condition VALUES ('TEMP_02', TO_DATE('2026-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.0, 1);
INSERT INTO ch6_condition VALUES
    ('TEMP_01', TO_DATE('2026-01-01 00:00:50', 'YYYY-MM-DD HH24:MI:SS'), 90.0, 0);
EXEC TABLE_FLUSH(ch6_condition);
ALTER ROLLUP ch6_condition_all FORCE;
ALTER ROLLUP ch6_condition_good FORCE;

2. 원본 조건과 ROLLUP 비교

SELECT DATE_TRUNC('minute', time) AS bucket, COUNT(value), AVG(value),
       MIN(value), MAX(value), FIRST(time, value), LAST(time, value)
  FROM ch6_condition
 WHERE name = 'TEMP_01' AND quality = 1
 GROUP BY bucket ORDER BY bucket;

SELECT /*+ ROLLUP_TABLE(ch6_condition_good) */
       rollup('min', 1, time) AS bucket, COUNT(value), AVG(value),
       MIN(value), MAX(value), FIRST(time, value), LAST(time, value)
  FROM ch6_condition WHERE name = 'TEMP_01'
 GROUP BY bucket ORDER BY bucket;

SELECT /*+ ROLLUP_TABLE(ch6_condition_all) */
       rollup('min', 1, time) AS bucket, COUNT(value), AVG(value),
       MIN(value), MAX(value), FIRST(time, value), LAST(time, value)
  FROM ch6_condition WHERE name = 'TEMP_01'
 GROUP BY bucket ORDER BY bucket;
버킷·집합COUNTAVGMINMAXFIRSTLAST
00:00 전체34010901090
00:00 quality=121510201020
00:01 두 집합 공통13030303030

이 표본은 불량값이 구간의 마지막에 있으므로 LAST도 달라집니다. FIRST/LAST는 시각·값 쌍이 아니라 선택한 value를 반환합니다.

명시적인 후보 선택

이 예제는 전체 통계와 정상 통계의 결과 집합을 고정하기 위해 힌트를 사용합니다. 자동 선택은 조건 없는 후보를 우선하지만 조건 후보만 있을 때는 필터된 통계를 선택할 수 있습니다. “조건 ROLLUP은 항상 무시된다”거나 “EXTENSION에는 항상 힌트가 필수”라는 규칙으로 해석하지 않습니다.

문법과 제약

일반 ROLLUP의 필터는 INTERVAL·EXTENSION 뒤의 WHERE에 작성합니다. 비교, BETWEEN, IN, LIKE, 논리 연산과 지원 스칼라 함수를 사용할 수 있지만 서브쿼리, 집계 함수와 태그 이름 PRIMARY KEY 조건은 지원하지 않습니다. Custom은 SELECT 내부 WHERE를 사용하므로 구문을 섞지 않습니다.

상태 확인과 정리

SELECT DISTINCT ROLLUP_NAME, PREDICATE, ENABLED
  FROM V$ROLLUP WHERE ROOT_TABLE = 'CH6_CONDITION';
DROP ROLLUP ch6_condition_good;
DROP ROLLUP ch6_condition_all;
DROP TABLE ch6_condition;

업무 품질 기준이 바뀌면 조건과 재집계 계획도 갱신합니다. 기존 집계가 새로운 조건으로 자동 전환되지는 않습니다. 제어재구성 범위를 확인합니다.

최근 업데이트