SQL 튜터 세션 정리
SQL
LeetCode
LeetCode 1484에서 GROUP_CONCAT으로 날짜별 판매 상품 목록을 만드는 패턴 정리
오늘 푼 문제
- 문제: LeetCode 1484. Group Sold Products By The Date
- 핵심 개념: 중복 제거, 날짜별 집계, 문자열 집계
- 사용 함수:
GROUP_CONCAT()
풀이 코드
WITH t1 AS (
SELECT DISTINCT sell_date, product
FROM Activities
)
SELECT
sell_date,
COUNT(product) AS num_sold,
GROUP_CONCAT(product ORDER BY product SEPARATOR ',') AS products
FROM t1
GROUP BY sell_date
ORDER BY sell_date;핵심 개념 정리
이 문제는 같은 날짜에 같은 상품이 여러 번 등장할 수 있으므로, 먼저 (sell_date, product) 조합의 중복을 제거해야 한다.
SELECT DISTINCT sell_date, product
FROM Activities그다음 날짜별로 묶어서 서로 다른 상품 수와 상품명 목록을 만든다.
GROUP BY sell_date엑셀의 TEXTJOIN처럼 여러 행의 문자열을 하나로 합치는 MySQL 함수는 GROUP_CONCAT()이다.
GROUP_CONCAT(product ORDER BY product SEPARATOR ',')여기서 ORDER BY product는 상품명을 사전순으로 정렬하기 위한 조건이고, SEPARATOR ','는 쉼표로 연결하겠다는 의미다.
오늘의 메타 정리
처음 접근은 좋았다. 문제를 다음처럼 정확히 분해했다.
- 중복 행이 있을 수 있다.
- 날짜별 서로 다른 상품 수를 세야 한다.
- 같은 날짜의 상품명을 하나의 문자열로 합쳐야 한다.
특히 TEXTJOIN 같은 함수가 있을 것이라고 추론한 점이 좋았다. 실제 MySQL에서는 같은 역할을 GROUP_CONCAT()이 수행한다.
주의할 점은 CTE 문법에서 닫는 괄호가 빠지지 않게 하는 것, 그리고 LeetCode 요구사항처럼 상품명을 정렬해야 할 때는 GROUP_CONCAT() 내부에 ORDER BY를 넣어야 한다는 점이다.