8주간의 SQL 챌린지에서 배운 교훈: 창 기능 및 순위 지정

👩🏼‍💻 using Google BigQuery SQL syntax
📁 check the Github repository for context



오랫동안 저는 SQL의 WINDOW 함수와 사랑/증오 관계를 유지해 왔지만 최근에 마침내 빛을 보기 시작한 순간을 가졌습니다.
DENSE_RANK RANKROW_NUMBER는 보다 강력한 WINDOW 기능 중 하나이며 사용 사례에 맞는 올바른 선택을 하기 위해 어떻게 다르게 작동하는지 이해하는 것이 중요합니다.

프레임을 구성하는 데 도움이 되는 예를 자세히 살펴보겠습니다.

아래 쿼리 ...

SELECT 
s.customer_id,
s.order_date,
m.product_name, 
ROW_NUMBER () OVER (PARTITION 
  BY customer_id ORDER BY order_date ASC) AS row_number,
RANK () OVER (PARTITION 
  BY customer_id ORDER BY order_date ASC) AS rank,
DENSE_RANK () OVER(PARTITION 
  BY customer_id ORDER BY order_date ASC) AS dense_rank
FROM sqlchallenge_week1.sales AS s
  JOIN sqlchallenge_week1.menu AS m
    ON s.product_id = m.product_id
ORDER BY customer_id;


... 아래 출력을 생성합니다.



위의 이미지에서 WINDOW 함수가 실제로 어떻게 작동하고 표준 AGGREGATE 함수와 어떻게 다른지 알 수 있습니까?
  • WINDOW 함수는 매개변수 세트를 기반으로 테이블의 파티션을 생성합니다. 우리의 경우 파티션은 모든 고객 ID에 대해 생성되며 해당 파티션의 레코드는 주문 날짜 오름차순으로 정렬됩니다.
  • 다음으로 테이블에 추가되는 새 열로 이동할 값의 모든 행이 생성되는 해당 파티션에서 함수를 호출합니다.

  • 테이블의 예를 보면 결과가 그룹화되지 않았음을 알 수 있습니다. 즉, 같은 양의 행(14)이 들어와 나갔습니다. 이것이 WINDOW functions (분석 함수라고도 함)이 AGGREGATE functions과 다른 점입니다. 이 예제의 경우 COUNT()와 같은 AGGREGATE 함수는 고객 ID당 모든 행을 그룹화한 다음 각 그룹의 행 수를 계산하고 고객 ID당 단일 값을 반환하여 아래 출력을 생성합니다.



    이제 WINDOW 함수로 돌아가서 RANK , DENSE_RANKROW_NUMBER 가 서로 어떻게 다른지 살펴보겠습니다.

    ROW_NUMBER
    파티션 또는 창의 모든 행에는 정렬된 파티션의 첫 번째 행인 1부터 시작하는 번호가 할당됩니다. 창의 모든 행에 고유한 번호가 할당되고 해당 번호의 순서가 1씩 증가하는 순서임을 알 수 있습니다.

    RANK
    파티션 또는 창의 각 행에 번호를 할당할 때 ROW_NUMBER와 동일한 논리를 따릅니다. 유일한 차이점은 동일한 주문 날짜의 행이 동일한 순위 번호를 받고 다음 하위 집합의 모든 행에 대한 순위 번호가 1씩 증가하지 않고 1 + 이전 하위 집합의 행 수라는 것입니다.

    DENSE_RANK
    DENSE_RANK의 경우 파티션의 하위 집합에 있는 모든 행에는 다음 하위 집합에 대해 1씩 증가하는 고유 번호가 할당됩니다.

    도움이 되셨기를 바랍니다. 질문이 있으면 댓글로 알려주세요.

    📚 Windows 기능에 대한 보다 폭넓은 보기를 위해 다음 블로그 게시물을 추천할 수 있습니다.

    An Easy Guide to Advanced SQL Window Functions

    Take your SQL from Good to Great: Part 4 (Window Functions)

    좋은 웹페이지 즐겨찾기