RATIO_TO_REPORT
RATIO_TO_REPORT
RATIO_TO_REPORT 함수는 그룹 안의 값이 그룹 안 값들의 합에서 차지하는 비율을 반환해요. expr1이 null로 평가되거나 그룹 안의 expr1 합이 0으로 평가되면 RATIO_TO_REPORT는 null을 반환해요.
출처: 문서
본문
문법 (Syntax)
RATIO_TO_REPORT( <expr1> ) [ OVER ( [ PARTITION BY <expr2> ]
[ ORDER BY <expr3> ] [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] ) ]
인자 (Arguments)
- expr1 — 숫자 데이터 타입(INTEGER, FLOAT, DECIMAL 등)으로 평가되는 표현식이에요.
- expr2 — 파티션으로 나눌 때 사용하는 선택적 표현식이에요.
- expr3 — 각 파티션 안에서 정렬할 때 사용하는 선택적 표현식이에요. 이 함수에서 파티션 안의 순서는 출력에 영향을 주지 않아요. 모든 윈도우 함수와 마찬가지로 이 함수에서 ORDER BY는 전체 쿼리 출력의 순서를 제어하지 않아요.
사용 메모 (Usage notes)
- RATIO_TO_REPORT는 다음과 같이 계산돼요: 현재 행의 expr1 인자 값 / 파티션의 expr1 인자 합
- OVER 절 안의 ORDER BY 절은 다른 윈도우 함수와의 구문 일관성을 위해 이 함수에서 허용되지만 계산에는 영향을 주지 않아요. Snowflake는 이 함수를 사용할 때 ORDER BY 절을 포함하지 않는 것을 권장해요.
예제 (Examples)
이 간단한 예제는 매장 체인 이익 중 각 개별 매장이 기여한 비율을 보여줘요:
CREATE TABLE store_profit (
store_id INTEGER,
province VARCHAR,
profit NUMERIC(11, 2));
INSERT INTO store_profit (store_id, province, profit) VALUES
(1, 'Ontario', 300),
(2, 'Saskatchewan', 250),
(3, 'Ontario', 450),
(4, 'Ontario', NULL) -- hasn't opened yet, so no profit yet.
;
SELECT store_id, profit,
100 * RATIO_TO_REPORT(profit) OVER () AS percent_profit
FROM store_profit
ORDER BY store_id;
+----------+--------+----------------+
| STORE_ID | PROFIT | PERCENT_PROFIT |
|----------+--------+----------------|
| 1 | 300.00 | 30.00000000 |
| 2 | 250.00 | 25.00000000 |
| 3 | 450.00 | 45.00000000 |
| 4 | NULL | NULL |
+----------+--------+----------------+
이 예제는 각 지방(province) 내 이익 중 해당 지방의 각 매장이 기여한 비율을 보여줘요:
SELECT province, store_id, profit,
100 * RATIO_TO_REPORT(profit) OVER (PARTITION BY province) AS percent_profit
FROM store_profit
ORDER BY province, store_id;
+--------------+----------+--------+----------------+
| PROVINCE | STORE_ID | PROFIT | PERCENT_PROFIT |
|--------------+----------+--------+----------------|
| Ontario | 1 | 300.00 | 40.00000000 |
| Ontario | 3 | 450.00 | 60.00000000 |
| Ontario | 4 | NULL | NULL |
| Saskatchewan | 2 | 250.00 | 100.00000000 |
+--------------+----------+--------+----------------+