아래 문제에서는 USER_ID, PRODUCT_ID로 묶었을 때 묶인 USER_ID의 개수가 2 이상인 데이터만 뽑는 것.
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(USER_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC
위에서 새로 배운 HAVING 절을 사용하여 SELECT 된 AVERAGE_DURATION에 조건을 걸어주었고 DATEDIFF 함수를 써서 기간을 구함.
날짜 간의 차이를 구하는 함수를 검색하다가 DATEDIFF 함수를 발견했는데, 보통 블로그나 사이트에 나와있는 DATEDIFF 함수는 매개변수를 3개 받음.
DATEDIFF(interval, date1, date2)
하지만 프로그래머스에 제출했을 때 Incorrect parameter count in the call to native function 'DATEDIFF'라는 오류가 떴고 확인해보니 위의 DATEDIFF는 MSSQL 함수였고 우리가 채점하는건 MySQL이어서 다른 함수였음.
MySQL의 DATEDIFF 함수는 date1, date2를 받아서 두 날짜 간의 차이를 반환해주는 함수.
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC
새로 배운 문법이나 함수는 없지만 subquery 사용법이 아직은 익숙치 않아서인지 풀기 어려운 문제였음.
SELECT P.ID, P.NAME, P.HOST_ID
FROM PLACES P
JOIN (
SELECT P2.ID, P2.NAME, P2.HOST_ID
FROM PLACES P2
GROUP BY P2.HOST_ID
HAVING COUNT(*) > 1
) B ON P.HOST_ID = B.HOST_ID
ORDER BY P.ID
subquery도 그렇고 IN 절을 처음 보는 문제였던 것 같음.
WITH CARS AS (
SELECT *
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(HISTORY_ID) >= 5
)
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(HISTORY_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
WHERE CAR_ID IN (SELECT CAR_ID FROM CARS)
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(HISTORY_ID) > 0
ORDER BY MONTH, CAR_ID DESC
사실 이 문제는 LIKE 절을 사용해서 풀 수 있긴 한데 찾는 이름이 6개나 돼서 or 같은 방법이 없나 검색하다가 정규표현식을 찾았음.
예제)
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME REGEXP '^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$'
ORDER BY ANIMAL_ID