Algorithm / / 2025. 4. 2. 00:09

[LeetCode SQL] 1484. Group Sold Products By The Date - 코드 리뷰 및 분석

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. 결과를 판매 날짜 순으로 정렬 (추가 권장)

 

단계별 설명:

 

  1. select sell_date: 결과를 표시할 첫 번째 열로 sell_date를 선택합니다. GROUP BY 절에도 사용되므로 각 그룹(날짜)을 대표하는 값이 됩니다.
  2. count(distinct product) as num_sold:
    • count(): 집계 함수로, 그룹 내의 행 수를 계산합니다.
    • distinct product: count 함수 내에서 distinct 키워드를 사용하여 각 sell_date 그룹 내에서 고유한 product 값만 카운트합니다. 이는 문제에서 요구하는 "number of different products sold" (서로 다른 판매된 상품의 수)를 정확히 계산합니다.
    • as num_sold: 계산된 고유 상품 수를 num_sold라는 별칭으로 출력합니다.
  3. group_concat(distinct product ...):
    • group_concat(): MySQL의 집계 함수로, 그룹 내의 여러 행에 있는 문자열 값을 지정된 구분자(separator)로 연결하여 하나의 문자열로 만듭니다.
    • distinct product: group_concat 함수 내에서도 distinct를 사용하여 각 sell_date 그룹 내의 고유한 product 이름만 포함시킵니다. 예를 들어, 특정 날짜에 'Mask'가 두 번 팔렸더라도 결과 문자열에는 'Mask'가 한 번만 포함됩니다.
  4. order by product: group_concat 함수 내에서 order by 절을 사용하여 연결될 product 이름들을 알파벳(lexicographically) 순서로 정렬합니다. 문제에서 "The sold products names for each date should be sorted lexicographically" 요구사항을 충족합니다.
  5. separator ',': group_concat 함수로 연결될 각 상품 이름 사이에 쉼표(,)를 구분자로 사용하도록 지정합니다.
  6. from Activities: 데이터를 가져올 테이블로 Activities를 지정합니다.
  7. group by sell_date: Activities 테이블의 행들을 sell_date 열의 값이 같은 것끼리 그룹화합니다. count()group_concat() 같은 집계 함수는 이 그룹 단위로 계산을 수행합니다.
  8. 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 BYSEPARATOR 옵션을 함수 내에서 지정할 수 있다는 점이 유용합니다.
  • 명시적 ORDER BY (결과 정렬): 최종 결과셋의 정렬 순서를 보장하기 위해 쿼리 마지막에 ORDER BY sell_date를 추가하는 것이 좋습니다.

 

결론:

 

제출된 쿼리는 LeetCode 1484 문제의 요구사항을 정확하고 효율적으로 해결합니다. 특히 DISTINCT 키워드와 group_concat 함수의 ORDER BY, SEPARATOR 옵션을 적절히 활용하여 원하는 결과를 정확하게 만들어냅니다. 최종 결과의 정렬을 보장하기 위해 마지막에 ORDER BY sell_date를 추가하는 것을 고려할 수 있습니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유