이벤트 분석을 위한 SQL 창 기능
창 함수는 결과의 각 행을 유지하면서 관련 행 전체를 계산합니다. 일반 GROUP BY는 많은 이벤트를 그룹당 한 행으로 줄입니다. 기간은 이전 값, 순위 또는 롤링 기준을 추가하면서 매일, 요청 또는 계정을 유지할 수 있습니다.
인접한 버킷 비교
WITH daily AS (
SELECT
date_trunc('day', timestamp_utc) AS day,
COUNT(*) AS completed_jobs
FROM job_events
WHERE status = 'completed'
AND timestamp_utc >= now() - INTERVAL '30 days'
GROUP BY date_trunc('day', timestamp_utc)
)
SELECT
day,
completed_jobs,
LAG(completed_jobs) OVER (ORDER BY day) AS previous_day_jobs,
AVG(completed_jobs) OVER (
ORDER BY day
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS rolling_7_bucket_average
FROM daily
ORDER BY day;
LAG는 창 순서에 따라 이전 행을 읽습니다. 프레임이 있는 AVG는 롤링 7버킷 기준선을 계산합니다. 첫 번째 행에는 기여 버킷이 7개 미만이므로 전체 창이 필요한 경우 레이블을 지정하거나 억제합니다.
비교단위별 파티션
각 서비스에 독립적인 시퀀스가 필요한 경우 PARTITION BY service를 추가하세요. 그렇지 않으면 이전 행이 다른 서비스에 속할 수 있습니다. 순서 열도 결정적이어야 합니다. 두 이벤트가 타임스탬프를 공유하는 경우 안정적인 식별자를 타이 브레이커로 추가하세요.
ROW_NUMBER는 논리 키당 하나의 이벤트를 선택하는 데 유용합니다.
ROW_NUMBER() OVER (
PARTITION BY delivery_id
ORDER BY timestamp_utc DESC, event_id DESC
) AS newest_rank
외부 쿼리에서 newest_rank = 1로 필터링합니다. 패턴을 사용하기 전에 "최신" 또는 "처음 승인"이 올바른 비즈니스 규칙인지 결정하세요.
Windows는 누락된 시간 버킷, 중복된 소스 이벤트 또는 모호한 행 단위를 복구하지 않습니다. 기간별 변화를 해석하기 전에 해당 조건을 검증하십시오. ID 규칙은 SQL 중복 제거를 읽고 Telemetry에서 테스트한 창 구문은 DataFusion SQL 참조를 읽어보세요.