47번 - 즐겨찾기 가장 많은 식당 정보 출력하기
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
<BEFORE>
select food_type,
rest_id,
rest_name,
max(favorites) favorites
from rest_info
group by 1
order by 1 desc
- 문제에서 필요한 컬럼들 설정해주고,
- 가장 많은 즐겨찾기 수라고 했기 때문에 favorites 칼럼에 max 함수를 이용하여 설정
- 음식 종류별로 찾아야 하기에 group by 1으로 지정 후
- 음식 종류를 기준으로 내림차순 정렬이기에 order by 1 desc로 설정
>> 실행했을 때 결과값은 나왔지만 실질적으로 맞는 답이 아니였다...
뭐가 틀린지 생각을 해보다가 전에도 이런 비슷한 이유로 틀려서 고민을 했던 적이 있어서 생각을 해봤더니
아마 그룹 바이절을 지정하면서 제대로된 즐겨찾기수가 찾아지지 않아 틀린 답이라고 나왔던 것 같다.
그래서 서브쿼리나 join으로 써야 하나 싶어 그 두개를 다 사용해봤지만 이건 틀린 답이라고 나왔다
좀 더 고민해보고 다른 사람들은 어떻게 풀었나 확인해봤더니 where절을 이용한 서브쿼리였다 !
다른 사람들의 풀이를 찾아보면서 왜 나의 전 풀이는 되지 않나 찾아봤더니
group by로 묶으면 가장 상단에 있는 데이터를 임의로 가져온다고 한다
https://school.programmers.co.kr/questions/38854
이 분의 설명으로 인해 잘 이해가 됐다
즉, GROUP BY 후 그냥 MAX를 해버리면 이는 최대값이 아니라 테이블 최상단 값을 가져와서 서브쿼리로 최대 값을 따로 찾아준다
<AFTER>
select food_type,
rest_id,
rest_name,
favorites
from rest_info
where (food_type, favorites) in (
select food_type,
max(favorites) favorites
from rest_info
group by food_type)
order by 1 desc
- 문제에 필요한 컬럼들 조회
- 매칭을 하기 위해 where절을 사용하고, In 안에 위 서브쿼리를 사용함으로써 위 결과와 똑같은 테이블만 불러오게끔 한다
- 그런 다음 order by를 통해 내림차순 해주면 정확한 결과값이 나오게 된다.
48번 - 식품분류별 가장 비싼 식품의 정보 출력하기
FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
select category,
price,
product_name
from food_product
where (category, price) in
(select category,
max(price) max_price
from food_product
where category in ('과자', '국', '김치', '식용유')
group by 1)
order by 2 desc
- 문제에서 말한 컬럼 조회
- 이 문제 또한 where 절을 이용한 서브쿼리문
- 식품분류별로 가장 비싼 식품의 가격 -- max(price)
- 식품분류별 -- group by category
- 조건 : 과자, 국, 김치, 식용유만 나와야 하기 때문에 where절로 조건 걸기
- 가격 기준으로 내림차순이니까 order by price desc
where절을 통한 서브쿼리이 작성되는지 몰랐는데 이번 문제를 통해 알게됐다.
그리고 그룹바이절에 대해서도 가장 상단에 있는 컬럼만 적용되는지도 잘 몰랐는데 이젠 어떻게 잘 써야할지 알겠다.
다음에도 이런 문제가 나오면 가능한 풀이를 보지 않고 내 실력만으로 풀어봐야지!
오랜만에 내 기준 좀 어려운 문제가 나온 것 같지만 그래도 이렇게 또 개념을 다지게 되는 시간이 된 것 같아 아주 뿌듯하다 !
'CODEKATA' 카테고리의 다른 글
Python CODEKATA 17번, 18번 (0) | 2024.07.09 |
---|---|
SQL CODEKATA 51번 (0) | 2024.07.09 |
20240705 Python CODEKATA 13번, 14번 (0) | 2024.07.05 |
20240704 SQL CODEKATA 46번 (0) | 2024.07.04 |
SQL CODEKATA 45번 (0) | 2024.07.03 |