Leet code에서 아래와 같은 문제를 접했다.
[코딩테스트/SQL - Leetcode] - 1484. Group Sold Products By The Date
Easy 문제여서 금방 풀고 다음 문제로 넘어가려고 했는데... 웬걸? 아무리 봐도 어떻게 풀어야 할 지 모르겠더라...
아니 이건 Easy 문제인데? 내가 이정도 수준... 일 리가 없지!
감도 못 잡겠는 문제가 Easy 문제일 리가 없었다. 그렇다는 건, 내가 모르는 어떤 함수를 이용하면 바로 뚝딱 풀릴 문제라는 것!
그리고 내가 몰랐던 그 함수는 GROUP_CONCAT 이라는 함수였다.
GROUP_CONCAT
1. 어떤 함수인가
- 여러 ROW에 있는 데이터를 합쳐서 한 번에 가져오는 함수다.
- 쉽게 말하자면 이름에서도 드러나듯, 그룹(GROUP)별로 데이터를 합치는(CONCAT) 함수다.
2. 어떻게 사용하는가
- 이 함수를 알게 해준 Leetcode의 해당 문제로 간단히 사용 예시를 들어보자.
Table : Activity
+------------+------------+
| sell_date | product |
+------------+------------+
| 2020-05-30 | Headphone |
| 2020-06-01 | Pencil |
| 2020-06-02 | Mask |
| 2020-05-30 | Basketball |
| 2020-06-01 | Bible |
| 2020-06-02 | Mask |
| 2020-05-30 | T-Shirt |
+------------+------------+
예시 1. 기본 형태 - GROUP_CONCAT(CONCAT 대상 컬럼)
select sell_date
, group_concat(product)
from Activities
group by sell_date
Output
+------------+------------------------------+
| sell_date | group_concat(product) |
+------------+------------------------------+
| 2020-05-30 | Headphone,Basketball,T-Shirt |
| 2020-06-01 | Pencil,Bible |
| 2020-06-02 | Mask,Mask |
+------------+------------------------------+
예시 2. 정렬(ORDER BY) - GROUP_CONCAT(CONCAT 대상 컬럼 ORDER BY 컬럼 ASC/DESC)
ORDER BY의 기본값은 ASC이므로 생략하면 오름차순 정렬이 된다.
위의 예시 1에서와 비교해보면 알 수 있는데, ORDER BY 자체를 생략하면 정렬 없이 위에서 아래로
쭉 순서대로 합친다.
(1)
select sell_date
, group_concat(product order by product)
from Activities
group by sell_date
Output
+------------+----------------------------------------+
| sell_date | group_concat(product order by product) |
+------------+----------------------------------------+
| 2020-05-30 | Basketball,Headphone,T-Shirt |
| 2020-06-01 | Bible,Pencil |
| 2020-06-02 | Mask,Mask |
+------------+----------------------------------------+
(2)
select sell_date
, group_concat(product order by product desc)
from Activities
group by sell_date
Output
+------------+---------------------------------------------+
| sell_date | group_concat(product order by product desc) |
+------------+---------------------------------------------+
| 2020-05-30 | T-Shirt,Headphone,Basketball |
| 2020-06-01 | Pencil,Bible |
| 2020-06-02 | Mask,Mask |
+------------+---------------------------------------------+
예시 3. 구분자 변경(SEPARATOR) - GROUP_CONCAT(CONCAT 대상 컬럼 SEPARATOR '구분자')
해 보면 알겠지만 구분자 자리에는 문자이기만 하면 뭐든 들어갈 수 있다.
위의 예시 1에서와 비교해보면 알 수 있는데, 구분자의 기본값은 콤마(,)이기 때문에
SEPARATOR 자체를 생략하면 콤마로 구분된다
(1)
select sell_date
, group_concat(product separator ':')
from Activities
group by sell_date
Output
+------------+-------------------------------------+
| sell_date | group_concat(product separator ':') |
+------------+-------------------------------------+
| 2020-05-30 | Headphone:Basketball:T-Shirt |
| 2020-06-01 | Pencil:Bible |
| 2020-06-02 | Mask:Mask |
+------------+-------------------------------------+
(2)
select sell_date
, group_concat(product separator 'ㅋㅋ')
from Activities
group by sell_date
Output
+------------+----------------------------------------+
| sell_date | group_concat(product separator 'ㅋㅋ') |
+------------+----------------------------------------+
| 2020-05-30 | HeadphoneㅋㅋBasketballㅋㅋT-Shirt |
| 2020-06-01 | PencilㅋㅋBible |
| 2020-06-02 | MaskㅋㅋMask |
+------------+----------------------------------------+
예시 4. 중복 값 제거(DISTINCT) - GROUP_CONCAT(DISTINCT CONCAT 대상 컬럼)
합쳐진 값에 중복이 있을 경우 제거한다.
예시 1과 비교해 보면 알겠지만, 20년 6월 2일에 MASK가 하나만 출력된다.
select sell_date
, group_concat(distinct product)
from Activities
group by sell_date
Output
+------------+--------------------------------+
| sell_date | group_concat(distinct product) |
+------------+--------------------------------+
| 2020-05-30 | Basketball,Headphone,T-Shirt |
| 2020-06-01 | Bible,Pencil |
| 2020-06-02 | Mask |
+------------+--------------------------------+
이렇게 GROUP_CONCAT() 함수가 어떤 역할을 하는지, 이 함수를 어떻게 사용하는지 간단한 예시를 들어 알아보았다!
** 여담
해당 문제를 GROUP_CONCAT 없이는 풀 수 없을까 싶어서 고민하다가 GPT에게 물어봤다.
... 그렇다고 한다;
'STUDY > SQL, DB' 카테고리의 다른 글
[MySQL] 대용량 csv 파일을 workbench에 업로드하기(Window OS) (1) | 2024.01.10 |
---|---|
INFORMATION_SCHEMA (0) | 2023.12.29 |
HackerRank - SQL (Advanced) Certificate (2) | 2023.12.26 |
HackerRank - SQL (Intermediate) Certificate (2) | 2023.12.26 |
[MySQL] - Row import failed with error: ("Data truncated for column at row 1", 1265) (2) | 2023.12.21 |