quantilesTimingArrayIf — 조건을 만족하는 배열의 타이밍 값 분위수 구하기

quantilesTimingArrayIf — 조건을 만족하는 배열의 타이밍 값 분위수 구하기

quantilesTimingArrayIfquantilesTiming 함수에 ArrayIf 결합자를 적용해서 조건이 참인 행의 배열 안 타이밍 값들의 분위수를 계산하는 방법을 보여드릴게요.

출처: 문서

본문

quantilesTiming 함수에 ArrayIf 결합자를 적용하면 조건이 참인 행의 배열 안 타이밍 값들의 분위수를 계산하는데, 이때 quantilesTimingArrayIf 집계 결합자 함수를 사용해요.

이 예제에서는 서로 다른 엔드포인트의 API 응답 시간을 저장하는 테이블을 만들고, quantilesTimingArrayIf로 성공한 요청의 응답 시간 분위수를 계산해볼게요.

Query

CREATE TABLE api_responses(
    endpoint String,
    response_times_ms Array(UInt32),
    success_rate Float32
) ENGINE = MergeTree
ORDER BY ();

INSERT INTO api_responses VALUES
    ('orders', [82, 94, 98, 87, 103, 92, 89, 105], 0.98),
    ('products', [45, 52, 48, 51, 49, 53, 47, 50], 0.95),
    ('users', [120, 125, 118, 122, 121, 119, 123, 124], 0.92);

SELECT
    endpoint,
    quantilesTimingArrayIf(0, 0.25, 0.5, 0.75, 0.95, 0.99, 1.0)(response_times_ms, success_rate >= 0.95) as response_time_quantiles
FROM api_responses
GROUP BY endpoint;

quantilesTimingArrayIf 함수는 성공률이 95%를 넘는 엔드포인트에 대해서만 분위수를 계산해요. 반환된 배열에는 다음 분위수들이 순서대로 들어 있어요:

  • 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]                                 │
   └──────────┴─────────────────────────────────────────────────────────────────────┘

더 알아보기 (Learn more)