quantilesTimingIf — 조건을 만족하는 타이밍 값 분위수 구하기
quantilesTimingIf — 조건을 만족하는 타이밍 값 분위수 구하기
quantilesTimingIf는 quantilesTiming 함수에 If 결합자를 적용해서 조건이 참인 행의 타이밍 값 분위수를 계산하는 방법을 보여드릴게요.
출처: 문서
본문
quantilesTiming 함수에 If 결합자를 적용하면 조건이 참인 행의 타이밍 값 분위수를 계산하는데, 이때 quantilesTimingIf 집계 결합자 함수를 사용해요.
이 예제에서는 서로 다른 엔드포인트의 API 응답 시간을 저장하는 테이블을 만들고, quantilesTimingIf로 성공한 요청의 응답 시간 분위수를 계산해볼게요.
Query
CREATE TABLE api_responses(
endpoint String,
response_time_ms UInt32,
is_successful UInt8
) ENGINE = MergeTree
ORDER BY ();
INSERT INTO api_responses VALUES
('orders', 82, 1),
('orders', 94, 1),
('orders', 98, 1),
('orders', 87, 1),
('orders', 103, 1),
('orders', 92, 1),
('orders', 89, 1),
('orders', 105, 1),
('products', 45, 1),
('products', 52, 1),
('products', 48, 1),
('products', 51, 1),
('products', 49, 1),
('products', 53, 1),
('products', 47, 1),
('products', 50, 1),
('users', 120, 0),
('users', 125, 0),
('users', 118, 0),
('users', 122, 0),
('users', 121, 0),
('users', 119, 0),
('users', 123, 0),
('users', 124, 0);
SELECT
endpoint,
quantilesTimingIf(0, 0.25, 0.5, 0.75, 0.95, 0.99, 1.0)(response_time_ms, is_successful = 1) as response_time_quantiles
FROM api_responses
GROUP BY endpoint;
quantilesTimingIf 함수는 성공한 요청(is_successful = 1)에 대해서만 분위수를 계산해요. 반환된 배열에는 다음 분위수들이 순서대로 들어 있어요:
- 0 (최솟값)
- 0.25 (제1사분위)
- 0.5 (중앙값)
- 0.75 (제3사분위)
- 0.95 (95번째 백분위)
- 0.99 (99번째 백분위)
- 1.0 (최댓값)
Response
┌─endpoint─┬─response_time_quantiles─────────────────────────────────────────────┐
1. │ orders │ [82, 87, 92, 98, 103, 104, 105] │
2. │ products │ [45, 47, 49, 51, 52, 52, 53] │
3. │ users │ [nan, nan, nan, nan, nan, nan, nan] │
└──────────┴─────────────────────────────────────────────────────────────────────┘