nonNegativeDerivative
nonNegativeDerivative
timestamp_column에 대한 metric_column의 음이 아닌 도함수(non-negative derivative)를 계산하는 윈도우 함수예요. 표준 SQL에 포함되지 않은 ClickHouse 전용 윈도우 함수입니다. 각 행에 대해 도함수는 윈도우의 평가 순서(윈도우의 ORDER BY 절이 결정)에서 이전 행을 기준으로 계산되며, timestamp_column이 아니라 그 ORDER BY가 순서를 정해요.
출처: 문서
본문
timestamp_column 인자는 현재 행과 이전 행 사이의 경과 시간을 측정하는 데만 읽히며, 그 자체로 행 순서를 정하지 않아요.
nonNegativeDerivative는 timestamp_column으로 행을 정렬하지 않고, 윈도우의 ORDER BY가 정렬합니다.
아래 공식이 적용되려면 timestamp_column이 윈도우의 평가 순서에서 엄격히 증가해야 하므로, 보통 윈도우를 timestamp_column 오름차순으로 정렬해야 해요(예: nonNegativeDerivative(metric, ts)와 함께 ... OVER (ORDER BY ts ASC)).
현재 행과 이전 행 사이의 경과 시간이 양수가 아닌 경우 - 즉 ORDER BY timestamp_column DESC이거나 중복(같은) 타임스탬프가 있는 경우 - 함수는 공식을 따르는 대신 해당 행에 0을 반환해요.
결과는 INTERVAL당 메트릭의 변화율로, 음수 값은 0으로 클램프(clamp)됩니다.
이런 동작은 카운터처럼 단조 증가하는 메트릭에 유용한데, 이러한 값에서 감소는 보통 실제 음의 변화율이 아니라 리셋을 의미하기 때문이에요.
구문(Syntax)
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])
OVER ([[PARTITION BY grouping_column] [ORDER BY sorting_column]
[ROWS, RANGE, or GROUPS expression_to_bound_rows_within_the_group]] | [window_name])
FROM table_name
WINDOW window_name AS ([PARTITION BY grouping_column] [ORDER BY sorting_column] [ROWS, RANGE, or GROUPS expression_to_bound_rows_within_the_group])
윈도우 함수 구문에 대한 자세한 내용은 윈도우 함수 - 구문을 참고하세요.
인자(Arguments)
metric_column— 도함수를 계산할 컬럼. (U)Int* 또는 Float*.timestamp_column— 윈도우 순서에서 현재 행과 이전 행 사이의 경과 시간을 측정하는 데 쓰는 컬럼. 행 순서를 정하지 않으며, 윈도우의ORDER BY가 정렬하고 보통 이와 같은 컬럼을 사용해야 해요. DateTime 또는 DateTime64.INTERVAL X UNITS— 선택. 결과를 스케일링할 시간 단위. 기본값은INTERVAL 1 SECOND. 고정 길이 단위만 지원해요(NANOSECOND,MICROSECOND,MILLISECOND,SECOND,MINUTE,HOUR,DAY,WEEK); 가변 길이 단위(MONTH,QUARTER,YEAR)는 예외를 발생시킵니다.
반환 값(Returned value)
각 행에 대해 다음 값으로 계산됩니다:
- 첫 번째 행은
0; - 이전 행 이후 경과 시간이 양수가 아닌 행(내림차순 순서나 중복 타임스탬프처럼 timestamp_i − timestamp_{i-1} ≤ 0인 경우)은
0; 그리고 - 그 외에는
(metric_i − metric_{i-1}) / (timestamp_i − timestamp_{i-1}) * interval입니다.
계산된 값이 음수면 0으로 클램프됩니다. 반환 타입은 Float64예요.
예시(Example)
다음 예시는 센서 판독값의 초당 변화율을 계산해요.
세 번째 행이 110에서 105로 떨어지므로 그 도함수는 0으로 클램프됩니다.
쿼리(Query)
CREATE TABLE sensor_readings
(
`sensor_id` UInt32,
`ts` DateTime,
`reading` Float64
)
ENGINE = Memory;
INSERT INTO sensor_readings VALUES
(1, '2024-01-01 00:00:00', 100),
(1, '2024-01-01 00:00:10', 110),
(1, '2024-01-01 00:00:20', 105),
(1, '2024-01-01 00:00:30', 130);
쿼리(Query)
SELECT
ts,
reading,
nonNegativeDerivative(reading, ts) OVER (ORDER BY ts ASC) AS deriv_per_second
FROM sensor_readings
ORDER BY ts ASC;
응답(Response)
┌──────────────────ts─┬─reading─┬─deriv_per_second─┐
1. │ 2024-01-01 00:00:00 │ 100 │ 0 │
2. │ 2024-01-01 00:00:10 │ 110 │ 1 │
3. │ 2024-01-01 00:00:20 │ 105 │ 0 │
4. │ 2024-01-01 00:00:30 │ 130 │ 2.5 │
└─────────────────────┴─────────┴──────────────────┘