해결된 질문
작성
·
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