본문 바로가기

SQL/DataLemar

[PostgreSQL] (Medium) Compressed Mode [Alibaba SQL Interview Question]

문제: https://datalemur.com/questions/alibaba-compressed-mode

 

나의 풀이: DENSE_RANK() 사용

SELECT item_count AS mode
FROM (
  SELECT *
       , DENSE_RANK() OVER(ORDER BY order_occurrences DESC) AS ranking
  FROM items_per_order) sub
WHERE ranking = 1
ORDER BY 1;

오늘것도 쉽다! 하고 풀었는데 솔루션 보니까 또 다른 풀이가 있다

 

첫번째는 MAX() 쓰는 방법

SELECT item_count AS mode
FROM items_per_order
WHERE order_occurrences = (
  SELECT MAX(order_occurrences)
  FROM items_per_order)
ORDER BY 1;

 

싱기하다 평소라면 이 방법을 가장 먼저 떠올렸을 텐데 최근에 랭크 문제 풀었다고 이번에는 덴스랭크가 먼저 떠올랐나보다

sql도 진짜 습관이 있는 듯

 

두번째는 몰랐던 MODE() WITHIN GROUP () 쓰는 방법

SELECT item_count AS mode
FROM items_per_order
WHERE order_occurrences = (
  SELECT MODE() WITHIN GROUP (ORDER BY order_occurrences DESC)
  FROM items_per_order)
ORDER BY 1;

함수가 꽤나 직관적이어서 이해하기는 쉽다

order_occureences (=그룹) 에서 내림차순 정렬을 했을 때의 최빈값 찾기! 정도

사용방법도 MAX() 위치에 고대로 넣으면 된다

 

오름차순 정렬 했을 때랑 내림차순 정렬 했을때랑 최빈값이 왜 달라지는지 의문이 들었다

찾아보니 같은 빈도를 갖는 값에 대한 필터링 역할을 한다

예를 들어 2, 3이 같은 빈도를 같는다면 desc는 3, asc는 2를 선택하게 되는 것!

같은 빈도에 대해서 먼저 오는 값을 가져오는 듯 하다

 

mysql에는 지원하지 않는 문법인듯!