로그 데이터를 다루다 보면 각 사용자별로 최신 1건만 추출해야 하는 상황이 있습니다.
이때 대부분 아래 패턴을 씁니다.
ROW_NUMBER()로 순번 생성WHERE rn = 1결과는 맞지만, 쿼리를 좀 더 간단히 할 순 없을까요?
WHERE 절에서는 윈도우 함수 결과를 사용할 수 없습니다.
WHERE는 윈도우 함수보다 먼저 실행ROW_NUMBER()는 SELECT 단계에서 계산그래서 윈도우 함수 필터링을 위해 한 단계 더 감싸야 했습니다.
QUALIFY는 윈도우 함수 결과를 필터링하기 위한 절입니다.
실행 순서상 윈도우 함수 이후에 동작합니다.
같은 쿼리를 QUALIFY로 작성하면 다음과 같습니다.
SELECT
user_id
, event_time
FROM events
QUALIFY
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY event_time DESC
) = 1;
| 절 | 필터 대상 |
|---|---|
| WHERE | 원본 행 |
| HAVING | 집계 결과 |
| QUALIFY | 윈도우 함수 결과 |
✔ 윈도우 함수 결과를 조건으로 걸러야 한다면, BigQuery에서는 QUALIFY를 활용해보세요.