[sql] DAY6 (프로그래머스 SQL 고득점 Kit)

ryz·2022년 10월 14일

프로그래머스 SQL

목록 보기
5/9
post-thumbnail

lv3. JOIN : 오랜 기간 보호한 동물(1)
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS AS I
LEFT OUTER JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3

/*상위 N개만 추출 -> 코드 맨 마지막에 LIMIT 숫자 붙여주면 됨
하위 N개만 추출 -> 코드 맨 마지막에 LIMIT 숫자 붙여주면 됨, 단, ORDER BY DESC로.*/

lv3. String, Date : 오랜 기간 보호한 동물(2)
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

/*날짜 차이 계산
DATEDIFF(날짜1, 날짜2) -> 날짜1 - 날짜2
*/

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS AS I
RIGHT OUTER JOIN ANIMAL_OUTS AS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE DATEDIFF(I.DATETIME, O.DATETIME)
ORDER BY DATEDIFF(I.DATETIME, O.DATETIME)
LIMIT 2

lv3. 2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 헤비 유저가 소유한 장소
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.

/* 내 코드
SELECT *
FROM PLACES 
GROUP BY HOST_ID
HAVING HOST_ID > 1
ORDER BY ID
*/

# 이건 아예 근처도 못 갔음...

SELECT *
FROM PLACES
WHERE HOST_ID
IN
(SELECT HOST_ID
 FROM PLACES
 GROUP BY HOST_ID
 HAVING COUNT(HOST_ID)>=2
)
ORDER BY ID

lv3. String, Date : 조건별로 분류하여 주문상태 출력하기
FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.

SELECT ORDER_ID, PRODUCT_ID, 
DATE_FORMAT(OUT_DATE,'%Y-%m-%d') AS OUT_DATE,
CASE
    WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
    WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
    ELSE '출고미정'
END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID

lv3. GROUP BY : 즐겨찾기가 가장 많은 식당 정보 출력하기
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

#맞는 것 같은데 왜 안되지...?의 내 코드 (일단 값도 다르다ㅠ)

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO 
GROUP BY FOOD_TYPE
HAVING MAX(FAVORITES)
ORDER BY FOOD_TYPE DESC

/*(안 되는 이유) : https://school.programmers.co.kr/questions/37996

좋은 생각입니다. 그러나 group by를 foodtype으로 했을 때 restid, rest_name이 max(favorites)인 row인지 아닌지 정확히 확신할 수 없습니다.
그 이유는 group by를 foodtype으로 진행했을 때 max(favorites)값은 정확히 내가 원하는 foodtype의 favorites라고 확신할 수 있지만 restid, restname은 group by로 묶여지고 제일 첫번째 로우가 가져와지기 때문에 max(favorites)랑 restid, restname이 일치 안할 수도 있습니다.
때문에 아래와 같이 foodtype과 max(favorites)를 먼저 찾고 그것과 일치하는 restid와 rest_name을 join을 통해 찾을 수 있습니다.
*/

#SELF JOIN 지금까지 푼 것중에 젤루 어렵다...
#https://kimsyoung.tistory.com/entry/SELF-JOIN-%E4%B8%8A-%EA%B0%99%EC%9D%80-%ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84-%EC%A1%B0%EC%9D%B8%ED%95%98%EA%B8%B0

SELECT R.FOOD_TYPE, R.REST_ID, R.REST_NAME, R.FAVORITES
FROM REST_INFO AS R
JOIN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS 'MF'
    FROM REST_INFO
    GROUP BY FOOD_TYPE
    ) AS M
ON R.FOOD_TYPE = M.FOOD_TYPE
AND R.FAVORITES = M.MF
ORDER BY R.FOOD_TYPE DESC

0개의 댓글