인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

성장캐님의 프로필 이미지

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

총 정리 문제 풀이 1~3번

총 정리 문제 풀이 2번 문제 추가 질문

해결된 질문

작성

·

106

0

카일님 안녕하세요. 강의 아주 잘 듣고 있습니다 감사합니다 :)

총 정리 문제 2번에서 추가 질문 드립니다.
제가 처음 풀때 문제를 잘못이해하여, type1 별 가장 많이 포획된 포켓몬 이름과 횟수를 각 type1 TOP 1 들을 구하려고 했습니다. MAX (COUNT) 라는 말도 안되는 쿼리를 작성하면서 고군분투 하였고, 결국 못 풀었습니다.
다행히 채점할때 카일님이 의도하신 출제방향으로는 답이 나와있는 상태여서 이해는 하였습니다 만. !

커머스라고 가정할 때 각 카테고리별(type1) , 가장 많이 팔린 제품(kor_name), 최다 판매수(cnt) 를 구해야 한다면, 제가 풀지못했던 문제로 해결할 수 있을 것 같아서요.

type1 별로 포획량 TOP 1을 구하는 쿼리는 어떻게 작성하면 좋을 까요?

답변 2

1

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

안녕하세요. 문제 열심히 풀고 계시는군요..! 잘하고 계시네요

말씀하신 결과를 얻고 싶다면, 윈도우 함수를 쓰는 것이 제일 빠릅니다. 윈도우 함수는 기본편에선 다루진 않고 BigQuery 활용편 에서 다룹니다. 윈도우 함수가 처음에 좀 어려운 부분이 있어서 활용편으로 빼두었어요.

 

말씀하신 MAX를 사용하는 방식으로 풀 수는 있긴 합니다. 다만 여러번 돌아가는 느낌이 들긴 하죠

WITH type_pokemon_counts AS (
    SELECT
        p.type1,
        p.kor_name,
        COUNT(tp.id) as cnt
    FROM basic.trainer_pokemon AS tp
    INNER JOIN basic.pokemon AS p 
    ON tp.pokemon_id = p.id
    GROUP BY p.type1, p.kor_name
), type_max_counts AS (
    SELECT 
        type1,
        MAX(cnt) AS max_cnt
    FROM type_pokemon_counts
    GROUP BY type1
)
SELECT 
    tpc.type1,
    tpc.kor_name,
    tpc.cnt
FROM type_pokemon_counts AS tpc
JOIN type_max_counts AS tmc 
ON tpc.type1 = tmc.type1 
AND tpc.cnt = tmc.max_cnt
ORDER BY tpc.cnt DESC

 

 

윈도우 함수를 사용한다면 아래 쿼리로 사용할 수 있습니다(문법은 모르실거라 그냥 이런 것이 있구나 정도로 생각하시고 활용편을 듣는 것을 추천드려요) : 더 직관적이고 쿼리가 짧아집니다

WITH ranked_pokemons AS (
  SELECT
    p.type1,
    p.kor_name,
    COUNT(tp.id) AS cnt,
    ROW_NUMBER() OVER (PARTITION BY p.type1 ORDER BY COUNT(tp.id) DESC) AS rn
  FROM basic.trainer_pokemon AS tp
  JOIN basic.pokemon AS p ON tp.pokemon_id = p.id
  GROUP BY p.type1, p.kor_name
)
SELECT
  type1,
  kor_name,
  cnt
FROM ranked_pokemons
WHERE rn = 1
ORDER BY cnt DESC;

0

성장캐님의 프로필 이미지
성장캐
질문자

감사합니다 카일님! 활용편 강의 듣고 알려주신 쿼리 다시 한번 살펴봐야겠네요. 감사합니다!