오늘은 빅쿼리에서 사용하는 Array , 그리고 Array 하면 빠질 수 없는 Unnest 에 대해 알아보겠습니다
빅쿼리 UI 상으로는
'Repeated' 라고 표현되는 것이 바로 Array 인데요,
예를 들어서 간단하게 아래 같은 구조의 도표가 있다고 생각해볼게요. 사람마다의 취미와 직업이 써져 있죠.
이렇게 각 1 사람당 1개의 취미 , 1개의 직업만 있다면 array 구조는 불필요합니다.
근데 취미가 여러개라면 ?
아래 이미지처럼 name 과 job
이 있던 행이 hobby가 늘어남에 따라
행이 5개였던게 8개로
늘어났죠.
지금은 예시이다 보니 5개 행이 8개로
늘었지만
수가 훨씬 많다면 공간 차지면에서 비효율적일수도 있고,
이후에 데이터를 추출할 때도, hobby 가 여러개 있다는걸 모르는
사람이라면
원하는 것과 다른 데이터를 가지게 될 수 도 있죠.
이럴 때 활용할 수 있는게 array 입니다.
아래 이미지를 보시면 array를 사용하면 hobby 가 여러개 있더라도
name 1명에게만 행이 생성되었습니다.
이렇게 한 개의 행에 특정 데이터들이 여러개 저장되면서, 데이터가
세로로 저장되 것이 Array 입니다.
참고로 빅쿼리에서 JSON 형식으로 아래와 같이 확인할 수 있습니다.
Array 를 만드는 방법은 여러가지가 있습니다.
select 'HAYEON' name , ['십자수', '헬스장'] hobby , '공무원' job
select 'HAYEON' name , Array
GENERATE_ARRAY (시작 숫자 , 마지막 숫자 , 간격)
select GENERATE_ARRAY(2,20,4) GENERATE_ARRAY
GENERATE_DATE_ARRAY (시작 날짜 ,마지막 날짜 ,간격)
select GENERATE_DATE_ARRAY('2024-07-01','2024-08-01',interval
1 week) GENERATE_DATE_ARRAY
ARRAY_AGG
with hobby_table as
(select '십자수' as hobby
union all
select '뜨개질' as hobby
union all
select '클라이밍' as hobby
union all
select '게임' as hobby
union all
select '요가' as hobby
union all
select '영상 제작' as hobby
)
select array_agg(hobby) as hobby_array
from hobby_table
ARRAY_AGG는 나중에 자주 쓰게되는 것 같아서 좀 더 연습해볼게요 :)
위의 예시에서는 array 안에 넣을 항목들을 with 구문에 만들어 두었었는데
만약 저장되어 있는 테이블에서 array_agg 를 써야한다면
어떻게 해야할까요?
가장 처음에 가지고 있던 테이블을 보면 이렇게 되어 있는데,
만약..... 여기 있는 인물들이
직업이 바뀌는 상황이 있었다면? 연도별로 직업이 달라져야하지
않을까요?
또 중간에 취미가 바뀌거나 사라졌을 수도 있겠죠?
한번 아래처럼 표를 수정해보았어요.