Data Base/BigQuery

ARRAY, STRUCT

Eprld 2025. 5. 15. 18:42

ARRAY(배열)

-프로그래밍 언어에서 지원하는 자료형 중 하나

-같은 타입의 여러 값을 하나의 컬럼에 저장할 수 있는 자료형

Ex> 1, 3, 5, 6을 각각을 숫자형으로 저장하는 것이 아닌 하나로 저장

-Big Query에선 []을 사용하거나 ARRAY로 지정해서 쓸 수 있음

-배열로 저장할 때 저장 용량이 효율적

 

배열 생성하기

1)대괄호 사용하기

-대괄호[] 사용하기

SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
 UNION ALL
 SELECT [2, 4, 8, 16, 32]
 UNION ALL
 SELECT [5, 10]

 

2)ARRAY<> 사용하기 : ARRAY<자료형>

-"가"는 String이라 실행이 불가능하다
SELECT
  ARRAY<INT64>[0,1,"가"] AS some_numbers

Array element type STRING does not coerce to INT64 at [2:20]

 

 

3)배열 생성 함수 사용

SELECT
  GENERATE_DATE_ARRAY('2024-01-01', '2024-02-01', INTERVAL 1 WEEK) AS output1,
  GENERATE_ARRAY(1,5,2) AS output2

 

 

4)ARRAY_AGG 함수 사용 : 여러 결과를 마지막에 배열로 저장하고 싶은 경우

-ARRAY_AGG 함수 사용 : 여러 결과를 마지막에 배열로 저장하는 경우

WITH programmong_languages AS (
  SELECT "ptyhon" AS programmong_languages
  UNION ALL
  SELECT "go"
  UNION ALL
  SELECT "scala"
)

SELECT *
FROM programmong_languages

 

-ARRAY_AGG 함수 : 여러 결과를 마지막에 배열로 저장하고 싶은 경우

SELECT ARRAY_AGG(programmong_languages) AS out_put
FROM programmong_languages

 

배열에 접근하기 위해서는 OFFSET, ORDINAL을 사용한다.

-OFFSET : 0부터 시작

-ORDINAL : 1부터 시작

Ex> SELECT 배열_컬럼[OFFSET/ORDINAL숫자)]

 

-단, 배열의 길이보다 큰 값을 지정하면 오류가 발생한다

: Array index N is out of bounds (overflow) 방지하기 위해 SAFE_를 항상 추가

 

WITH array_samples AS (
  SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
  UNION ALL
  SELECT [2, 4, 8, 16, 32]
  UNION ALL
  SELECT [5, 19]
)

SELECT
  some_numbers[SAFE_OFFSET(1)] AS first_value
FROM array_samples

 

WITH array_samples AS (
  SELECT [0, 1, 1, 2, 3, 5] AS some_numbers
  UNION ALL
  SELECT [2, 4, 8, 16, 32]
  UNION ALL
  SELECT [5, 19]
)

SELECT
  some_numbers[SAFE_OFFSET(5)] AS first_value
FROM array_samples

 

STRUCT(구조체)

-프로그래밍 언어에서 지원하는 자료형 중 하나

-서로 다른 타입의 여러 값을 하나의 컬럼에 저장할 수 있는 자료형

Ex> 사람이라는 STRUCT에 이름(문자열), 나이(정수), 성별(문자) 등을 하나로 묶어 저장

 

1) 소괄호() 사용하기

 

SELECT

   (1, 2, 3) AS struct_test

2) STRUCT<>() 사용하기 : STRUCT<자료형>(데이터)

SELECT
  STRUCT<hi INT64, hello INT64, awesome STRING>(1,2,'HI') AS struct_test

 

SELECT
  struct_test.hi,
  struct_test.hello
FROM(
  SELECT
    STRUCT<hi INT64, hello INT64,
    awesome STRING>(1,2,'HI') AS struct_test
)

 

UNNEST

UNNEST는 CROSS JOIN과 , 를 사용해서 작성을 할 수 있다.

-배열을 직접적으로 접근해서 사용하는 것보다, 독립적인 행으로 풀어서(평면화) 사용

= ARRAY의 요소를 독립적인 행으로 펼칠 때 UNNEST를 사용한다

WITH example_data AS(
  SELECT
    'kyle' AS name,
    ['Python', 'SQL', 'R', 'Julia', 'Go'] AS preferred_language,
    'Incheon' AS hometown
  UNION ALL
  SELECT
    'max' AS name,
    ['Python', 'SQL', 'Scala', 'Java', 'Kotlin'] AS preferred_language,
    'Seoul' AS hometown
  UNION ALL
  SELECT
    'yun' AS name,
    ['Python', 'SQL'] AS preferred_language,
    'Incheon' AS hometown
  )
 
SELECT
  name,
  pre_lang,
  hometown
FROM example_data
CROSS JOIN UNNEST(preferred_language) AS pre_lang

 

 

'Data Base > BigQuery' 카테고리의 다른 글

sql 총 정리 문제 풀이  (0) 2025.05.13
윈도우 함수 문제 풀이  (0) 2025.05.13
데이터 리터러시  (0) 2025.05.12
Window 함수  (0) 2025.05.12
제품 성장 단계에 따른 지표 정의  (0) 2025.05.12