LeetCode 1484. Group Sold Products By The Date - SQL 코드 리뷰 및 분석
제공해주신 MySQL 쿼리문은 LeetCode 1484번 문제의 요구사항을 정확하게 만족시키는 훌륭한 해결책입니다. 각 부분을 자세히 분석해보겠습니다.
쿼리 분석:
select
sell_date, -- 1. 판매 날짜 선택
count(distinct product) as num_sold, -- 2. 날짜별 고유 상품 개수 계산
group_concat(
distinct product -- 3. 날짜별 고유 상품 목록 생성 (중복 제거)
order by product -- 4. 상품명을 알파벳 순으로 정렬
separator ',' -- 5. 쉼표(,)로 구분
) as products
from
Activities -- 6. Activities 테이블에서 데이터 조회
group by
sell_date -- 7. 판매 날짜(sell_date) 기준으로 그룹화
order by
sell_date; -- 8. 결과를 판매 날짜 순으로 정렬 (추가 권장)
단계별 설명:
select sell_date
: 결과를 표시할 첫 번째 열로sell_date
를 선택합니다.GROUP BY
절에도 사용되므로 각 그룹(날짜)을 대표하는 값이 됩니다.count(distinct product) as num_sold
:count()
: 집계 함수로, 그룹 내의 행 수를 계산합니다.distinct product
:count
함수 내에서distinct
키워드를 사용하여 각sell_date
그룹 내에서 고유한product
값만 카운트합니다. 이는 문제에서 요구하는 "number of different products sold" (서로 다른 판매된 상품의 수)를 정확히 계산합니다.as num_sold
: 계산된 고유 상품 수를num_sold
라는 별칭으로 출력합니다.
group_concat(distinct product ...)
:group_concat()
: MySQL의 집계 함수로, 그룹 내의 여러 행에 있는 문자열 값을 지정된 구분자(separator)로 연결하여 하나의 문자열로 만듭니다.distinct product
:group_concat
함수 내에서도distinct
를 사용하여 각sell_date
그룹 내의 고유한product
이름만 포함시킵니다. 예를 들어, 특정 날짜에 'Mask'가 두 번 팔렸더라도 결과 문자열에는 'Mask'가 한 번만 포함됩니다.
order by product
:group_concat
함수 내에서order by
절을 사용하여 연결될product
이름들을 알파벳(lexicographically) 순서로 정렬합니다. 문제에서 "The sold products names for each date should be sorted lexicographically" 요구사항을 충족합니다.separator ','
:group_concat
함수로 연결될 각 상품 이름 사이에 쉼표(,)를 구분자로 사용하도록 지정합니다.from Activities
: 데이터를 가져올 테이블로Activities
를 지정합니다.group by sell_date
:Activities
테이블의 행들을sell_date
열의 값이 같은 것끼리 그룹화합니다.count()
와group_concat()
같은 집계 함수는 이 그룹 단위로 계산을 수행합니다.order by sell_date;
(권장 사항): 문제에서 "Return the result table ordered by sell_date"라고 명시했으므로, 최종 결과를sell_date
기준으로 오름차순 정렬하기 위해ORDER BY sell_date
절을 추가하는 것이 좋습니다.GROUP BY
절이 결과를 정렬하는 것처럼 보일 때도 있지만, SQL 표준에서는 이를 보장하지 않으므로 명시적으로ORDER BY
를 사용하는 것이 안전하고 명확합니다. (제출된 코드에는 이 부분이 없지만, 추가하는 것이 좋습니다.)
핵심 포인트:
DISTINCT
키워드의 활용:count()
와group_concat()
함수 모두에서DISTINCT
를 사용하여 각 날짜별로 고유한 상품의 수와 목록을 정확하게 계산하고 생성합니다.GROUP BY
절: 날짜별 집계를 위해 필수적입니다.GROUP_CONCAT
함수: 정렬된 상품 목록을 쉼표로 구분된 단일 문자열로 만드는 데 효과적입니다.ORDER BY
와SEPARATOR
옵션을 함수 내에서 지정할 수 있다는 점이 유용합니다.- 명시적
ORDER BY
(결과 정렬): 최종 결과셋의 정렬 순서를 보장하기 위해 쿼리 마지막에ORDER BY sell_date
를 추가하는 것이 좋습니다.
결론:
제출된 쿼리는 LeetCode 1484 문제의 요구사항을 정확하고 효율적으로 해결합니다. 특히 DISTINCT
키워드와 group_concat
함수의 ORDER BY
, SEPARATOR
옵션을 적절히 활용하여 원하는 결과를 정확하게 만들어냅니다. 최종 결과의 정렬을 보장하기 위해 마지막에 ORDER BY sell_date
를 추가하는 것을 고려할 수 있습니다.
'Algorithm' 카테고리의 다른 글
[LeetCode SQL] 185: Department Top Three Salaries - 코드 리뷰 및 분석 (0) | 2025.03.30 |
---|---|
[17144] 미세먼지 안녕! 문제 분석 및 리뷰 (0) | 2025.03.30 |
[16236] 아기 상어 문제 분석 및 리뷰 (0) | 2025.03.30 |
[LeetCode SQL] 585: Investments in 2016 - 코드 리뷰 및 분석 (0) | 2025.03.29 |
[LeetCode SQL] 1321: Restaurant Growth 코드 리뷰 및 분석 (0) | 2025.03.27 |