프로덕트 매니저/PM의 데이터

[SQL/Clickhouse] LIMIT n BY, 그룹별/조건별로 필요한 수만큼 추출하기

KmkmKim 2022. 10. 11. 12:18

조건에 따른 상위랭커를 뽑아보려면

처음에 SQL을 배우면 가장 먼저 배우는 것 중 하나가 LIMIT문이다. 그래서 처음에 RANK와 같은 순위 함수를 모르더라도, '거래액 순으로 상위 10개를 뽑아주세요'라는 요청을 받으면 어렵지 않게 출력할 수 있을 것이다.

 

다만, 가끔 전체가 아닌 그룹별로 뽑아야하는 경우가 발생할 수 있다.

"우리 고객사들을 카테고리별로 거래액 상위 10개 몰을 추출해주세요."

이런 경우, 초보인 경우는 WHERE에다가 카테고리 이름을 하나씩 쓰면서, 발품을 파는 경우가 많다.

(어떻게 확신하듯 작성하냐면, 내가 맨 처음에 그랬던 것 같다.)

 


그렇다면 어떻게 해야할까? 나중에 쿼리를 공부하면서 알게 된 방법은 크게 2가지가 있다.

하나는 RANK를 활용하는 것이고, 또 하나는 LIMIT 뒤에 BY를 활용하는 것이다.

 

RANK는 새로운 함수라 낯설 수 있지만, LIMIT BY를 알려드렸을 떄도 생각보다 놀라는 분들이 있으셨다.

정말 간단한 내용인만큼, 점심시간에 간단하게 끄적여봤다. (혹 누군가 또 물어본다면 이 포스팅 링크를 전달해야겠다.)

 

 

우선, 우리가 잘 아는 LIMIT부터 살펴본다. LIMIT은 입력한 수치만큼 행을 제한해서 추출해준다.

SELECT customer_id, category_name, gmv
FROM TABLE
ORDER BY gmv DESC -- 거래액 내림차순
LIMIT 5

위와 같이 입력하면, 특정 테이블에서 거래액을 내림차순으로 정렬한 다음 그 중에서 5개만 추출하게 된다.

 

그런데 위처럼 '카테고리별'로 같은 조건이 붙는 경우가 생기면 난해하다. 각 카테고리의 1등이 다른 카테고리의 2등보다 높다면 모르겠지만, 아닌 경우가 대부분이다. 우리는 각 카테고리별 1등인 musinsa, baemin, ikea라는 아이디를 뽑아야한다. 이 때 방법은 간단하다. LIMIT 뒤에 BY를 작성해주면 된다. 

 

위에 요청사항에 따라 쿼리를 작성하면 아래와 같다.

SELECT customer_id, category_name, gmv
FROM TABLE
ORDER BY gmv DESC -- 거래액 내림차순
LIMIT 1 BY category_name -- 카테고리명별 1개씩

위와 같이 작성하면, '거래액 내림차순으로 정렬한 다음은 카테고리별로 1개씩 뽑아라'라는 명령이 실행된다. 내림차순으로 했기 때문에 거래액 상위 1등만 추출될 것이다.

 

RANK에 대한 것은 나중에 포스팅해야지 끝. :)