본문 바로가기

SQL 코딩 입문

SQL 중급: 2일차

교재

https://www.inflearn.com/course/bigquery-%ED%99%9C%EC%9A%A9%ED%8E%B8/dashboard

 

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석) 강의 | 카일스쿨 - 인프런

카일스쿨 | Google Analytics 4, Firebase 데이터의 형태의 앱 로그 분석을 진행합니다. 배열, 윈도우 함수, 퍼널, 리텐션, Google Sheets 등 실무에서 사용할 때 유용한 내용들을 담았습니다., Google Analytics 4,

www.inflearn.com

 

한달만에 돌아와서, 1일차 내용을 복습하고 시작. 정리해두길 잘했다.

오늘은 연습 문제를 풀면서 UNNEST 방법과 구조체에 대한 이해를 높여보자.

 

https://console.cloud.google.com/bigquery

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

연습 문제를 기반으로 쿼리를 재구성했다

 

1. 브랜드별로 판매하는 제품군(products)을 UNNEST 해서 보자

아래와 같은 데이터가 있다고 가정한다.

ARRAY 형태로 제품군(products)가 저장되어 있다.

 

결과적으로 내가 얻고 싶은 데이터는 다음과 같다.

1일차 내용를 참고해서 쿼리를 날려본다. 

SELECT brand, products
FROM advanced.array_test
CROSS JOIN UNNEST(brand) AS brand_dt
 
오류가 난다. 자세히 읽어보니 UNNEST 안에 ARRAY 값을 넣지 않은 것이다.
 
UNNEST 안에는 어레이를 넣어야 한다고 말해준다.

 

SELECT brand, products
FROM advanced.array_test
CROSS JOIN UNNEST(products) AS products_dt
 
쿼리 실행은 성공했는데, 뭔가 이상하다. 왜 아직도 brand가 쪼개져 있을까.
나는 UNNEST를 했는데..
일단 첫 번째 연습 문제이기도 하니까, 강의 해설을 봤다.
 
 

 

결과적으로 내가 UNNEST 했던 결과를 product_dt 라고 선언해놓고 SELECT 쪽에 쓰지 않은게 문제였다.

그리고 기존의 products 를 SELECT에서 제외해야 한다.

products를 그대로 두면, ARRAY가 안 풀린 내용이 그대로 조회되기 때문이다.

 
SELECT
 brand,
 -- products,
 products_dt
FROM advanced.array_test
CROSS JOIN UNNEST(products) AS products_dt

 

ARRAY가 예쁘게 UNNEST 완료되었다.

 

그런데 왜 브랜드B가 먼저 나오는지 모르겠다.

원본 데이터가 브랜드B부터 시작하기 때문인 것 같은데..

id를 브랜드 A, B, C에 따라서 1, 2, 3으로 지정했는데 왜 순서대로 정렬되지 않는지 모르겠다.

이 부분은 추가 검색해서 댓글로 올려두자.

 

UNNEST 하는 방법은 두 줄로 요약 정리한다
1. CROSS JOIN UNNEST(ARRAY_COLUMN 명칭) AS 새로운 명칭 코드를 마지막 줄에 작성
2. SELECT 쪽에서 새로운 명칭 사용하고, 기존 컬럼 명칭은 지운다.

 

 

2. 브랜드별 담당 매니저와 연락처를 추출해보자

결론적으로 내가 얻고 싶은 데이터는 다음과 같다.

 

일단 1번 내용을 참고해서 쿼리를 만들어 돌려본다.

SELECT
 brand,
 -- manager,
 mn,
 mm
FROM advanced.array_test AS atest
CROSS JOIN UNNEST(manager.name) AS mn
CROSS JOIN UNNEST(manager.mobile) AS mm

 

에러가 났는데.. 무슨 소리인지 잘 이해할 수가 없다.

그래서 뭘 고쳐야.. 하나요?

 

AI에게 물어보니까 명쾌하게 답을 준다.

 

에러가 다시 났다.. 안된다고 하니까 뱉어준 새로운 쿼리문.

SELECT
  brand,
  manager.name AS mn,
  manager.mobile AS mm
FROM advanced.array_test AS atest
CROSS JOIN UNNEST(atest.manager) AS manager

 

성공했다! 쿼리를 다시 읽어보니 이해가 된다.

manager.name과 manager.mobile 데이터가 있었으니까, CROSS JOIN UNNEST를 각각 다 작성하는 것이 아니라,

CROSS JOINI UNNEST(atest.manger) 하면 되는 것이다!

 

STRUCT를 UNNEST하는데 성공했다

 

그럼 이제 다시 강의를 틀어, 정답이 맞는지 확인했다.

SELECT
 brand,
 managers
FROM advanced.array_test AS atest
CROSS JOIN UNNEST(manager) AS managers

 

이럴수가. 훨씬 더 짧고 간결한 쿼리로 동일한 결과가 나온다.

 

 

 

쿼리의 세계는 정말 깊고 넓어서 배울 점이 너무 많은 것 같다.

특히 ARRAY, STRUCT 구조를 이해하고 쿼리문을 어떻게 작성하는지 알게 되면, 저렇게 짧은 문장으로도 원하는 값을 얻을 수 있다는 것이 나의 호기심을 자극한다.

 

이번에도 2일차까지 오는 기간이 길고 힘들었지만, 이제는 조금 집중해서 SQL을 알아가보려고 한다.

3일차는 내일 합니다! (선언)

 

데이터 구조를 이해하고 언어를 배우면 효율적으로 처리할 수 있습니다

 

 

 

'SQL 코딩 입문' 카테고리의 다른 글

SQL 중급: 4일차  (1) 2024.11.23
SQL 중급: 3일차  (0) 2024.11.17
SQL 중급: 다시 1일차  (3) 2024.10.26
SQL 중급: 1일차  (0) 2024.03.20
완강, 또 다른 시작  (0) 2021.05.05