SQL에서 데이터를 다룰 때, 하나의 컬럼에 여러 개의 값을 저장해야 하는 경우가 있습니다. 특히 JSON 데이터나 이벤트 로그 데이터를 다룰 때 배열(Array)을 사용하면 데이터를 효율적으로 관리할 수 있는데요. 하지만 배열을 사용할 때 중복된 값이 발생할 수 있어 이를 처리하는 방법이 필요합니다.
이번 포스팅에서는 SQL에서 배열을 다루는 이유, 중복 제거 방법, 그리고 배열 관련 SQL 함수들을 예제와 함께 상세히 설명해드리겠습니다.
1. SQL에서 배열을 사용하는 이유
배열을 사용하면 여러 개의 값을 하나의 컬럼에 저장할 수 있어 데이터 정규화를 줄이고, 특정한 경우 성능을 향상시킬 수 있습니다. 예를 들어, 사용자가 특정 상품을 클릭한 기록이 있다고 가정해보겠습니다.
📌 일반적인 데이터 저장 방식 (행 기반)
user_id | product_id
--------|-----------
1001 | A
1001 | B
1001 | A
1002 | C
1002 | A
이 경우, 동일한 user_id
가 여러 행을 차지하면서 중복된 데이터(예: 1001
이 A
를 두 번 클릭)가 존재합니다.
📌 배열을 활용한 데이터 저장 방식
SELECT user_id, ARRAY_AGG(product_id) AS clicked_products
FROM user_clicks
GROUP BY user_id;
📌 결과:
user_id | clicked_products
--------|-----------------
1001 | ['A', 'B', 'A']
1002 | ['C', 'A']
이제 하나의 user_id
당 하나의 행만 존재하고, 클릭한 상품 목록이 배열로 저장됩니다. 하지만 여기서 중복된 값(‘A’)이 포함되어 있습니다. 이걸 해결하기 위해 배열에서 중복을 제거해야 합니다.
2. 배열에서 중복이 발생하는 이유
배열에서 중복이 발생하는 이유는 다음과 같습니다:
- 사용자가 동일한 데이터를 여러 번 입력하는 경우 (예: 같은 상품을 여러 번 클릭)
- 이벤트 로그 데이터에서 특정 이벤트가 중복으로 기록되는 경우
- JSON 데이터에서 동일한 값이 여러 번 포함된 경우
배열의 중복을 제거하면 데이터 분석의 정확도가 향상되고, 불필요한 데이터 처리 비용이 줄어듭니다.
3. SQL에서 배열의 중복 제거 방법
1️⃣ DISTINCT를 사용하여 중복 제거
배열에서 중복을 제거할 때 가장 많이 사용하는 방법은 ARRAY_AGG(DISTINCT column)
을 활용하는 것입니다.
✅ 예제: 중복 제거 없이 배열 생성
SELECT user_id, ARRAY_AGG(product_id) AS clicked_products
FROM user_clicks
GROUP BY user_id;
📌 결과:
user_id | clicked_products
--------|-----------------
1001 | ['A', 'B', 'A']
1002 | ['C', 'A']
여전히 1001
의 배열에는 중복된 ‘A’가 포함되어 있습니다.
✅ 예제: 중복 제거 후 배열 생성
SELECT user_id, ARRAY_AGG(DISTINCT product_id) AS clicked_products
FROM user_clicks
GROUP BY user_id;
📌 결과:
user_id | clicked_products
--------|-----------------
1001 | ['A', 'B']
1002 | ['C', 'A']
이제 중복된 ‘A’가 제거된 것을 확인할 수 있습니다.
4. 배열을 다루는 주요 SQL 함수 소개
배열을 다룰 때 유용한 SQL 함수들을 정리해보았습니다. (PostgreSQL, BigQuery, Databricks 등에서 지원)
함수 | 설명 | 예제 |
---|---|---|
ARRAY_AGG(column) | 컬럼 값을 배열로 변환 | SELECT ARRAY_AGG(product_id) FROM table; |
ARRAY_AGG(DISTINCT column) | 배열 생성 시 중복 제거 | SELECT ARRAY_AGG(DISTINCT product_id) FROM table; |
UNNEST(array_column) | 배열을 개별 행으로 변환 | SELECT UNNEST(['A', 'B', 'C']); |
ARRAY_LENGTH(array_column) | 배열의 길이 반환 | SELECT ARRAY_LENGTH(['A', 'B', 'C']); → 3 |
ARRAY_CONTAINS(array, value) | 배열에 특정 값이 있는지 확인 | SELECT ARRAY_CONTAINS(['A', 'B', 'C'], 'A'); → true |
ARRAY_DISTINCT(array_column) | 배열 내 중복 제거 | SELECT ARRAY_DISTINCT(['A', 'B', 'A']); → ['A', 'B'] |
5. 정리
SQL에서 배열을 활용하면 데이터를 더욱 효율적으로 관리할 수 있지만, 중복된 값이 포함될 수 있습니다. 배열에서 중복을 제거하는 방법으로 ARRAY_AGG(DISTINCT column)
을 사용하면 중복된 값 없이 배열을 만들 수 있습니다. 또한, 배열 관련 함수들을 적절히 활용하면 데이터를 더욱 효과적으로 분석할 수 있습니다.
배열을 다룰 때 위에서 소개한 SQL 함수들을 활용하여 보다 깔끔한 데이터를 만들어보세요! 🚀
답글 남기기