[SQL 분석][Ch2] 빅쿼리의 유용한 함수

김지현·2024년 7월 13일

SQL 분석

목록 보기
18/40

빅쿼리는 열기반 저장 방식 사용 >> 사용할 컬럼만 가져오는 것이 효율적

EXCEPT / REPLACE

EXCEPT ('제외할 컬럼') : 필요 없는 컬럼 빼고 불러오기
REPLACE ('대체할 값' AS '컬럼명') : 불러올 때 간단하게 바꾸기

-- EXCEPT
SELECT * EXCEPT (shipping_limit_date, freight_value)
FROM `olist.olist_order_items`
LIMIT 100
;

-- REPLACE
SELECT * REPLACE (price * 10000 AS price)  -- price x 10000 값이 바로 출력됨
FROM `olist.olist_order_items`
LIMIT 100
;

데이터 타입 변경 함수 CAST / SAFE_CAST

CAST('값' AS '데이터 타입')
SAFE_CAST('값' AS '데이터 타입')

CAST('123' AS INT64)  -- INT64
SAFE_CAST('123' AS INT64)  -- INT64

CAST('abc' AS INT64)  -- error
SAFE_CAST('abc' AS INT64)  -- null

오류를 발생시키지 않는 SAFE 연산
→ 에러가 있을 경우 에러를 발생시키지 않고 null 반환

SAFE_ADD(X, Y) = X + Y
SAFE_SUBTRACT(X, Y) = X - Y
SAFE_MULTIPLY(X, Y) = X * Y
SAFE_DIVIDE(X, Y) = X / Y  → 가장 자주 사용

특히 잘 쓰이는 SAFE_DIVIDE(X, Y)
→ 연산자 /로 나누면 error > SAFE_DIVIDE 이용하여 error 해결 (IFNULL과 조합하면 0으로 반환 가능)

SELECT
  -- 5/0  -- error
  SAFE_DIVIDE(10, 0),  -- null 반환
  IFNULL(SAFE_DIVIDE(10, 0), 0)  -- null값을 0으로 반환
;

ROW_NUMBER() / RANK() / DENSE_RANK()

  • 순위/행 번호를 매기는 방법
  • ROW_NUMBER() : 중복없는 순위(고유)
  • RANK() : 동점일 때 중복 순위(공동 등수) + 공동 순위자가 있을 때 그 수만큼 건너뛰고 다음 등수를 매김
  • DENSE_RANK() : 동점일 때 중복 순위(공동 등수) + 순위를 연속으로 매김
  • ORDER BY [조건]은 필수
  • PARTITION BY는 순위를 구분하고 싶은 기준이 있을 때 사용

예제)

SELECT
  *,
  ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) AS col_rownum,
  RANK() OVER (PARTITION BY class ORDER BY score DESC) AS col_rank,
  DENSE_RANK() OVER (PARTITION BY class ORDER BY score DESC) AS col_denserank
FROM tb
ORDER BY class


CASE

  • 조건에 따라 값 부여
CASE
	WHEN [조건1] THEN [조건1 해당 시 결과]
    WHEN [조건2] THEN [조건2 해당 시 결과]
    ...
    ELSE [모두 해당하지 않을 때 결과]
END

0개의 댓글