본문 바로가기

SQL28

[BigQuery] Array, Struct 그리고 unnest 빅쿼리에는 Array (배열) 와 Struct (구조체) 라는 개념이 있다. 이 Array 와 Struct 가 생소하게 느껴질 수 있다. 일반적으로 쿼리문의 결과는 아래 그림과 같은 행(row)과 열(column)로 이루어진 테이블(table) 형태의 결과를 갖는다. GA4와 연결된 BigQuery 창에서 간단하게 쿼리를 해보면 쉽게 array와 struct 를 볼 수 있는데, 아래 그림과 같다. Array 는 위 그림에서 key에 해당되는데 하나의 셀(특정 행,열 위치)에 여러개의 값이 다시 row 처럼 배열로 들어가 있는 형태이다. Struct 는 key 옆에 value 라는 컬럼인데 value.string_value, value.int_value, value.float_value, value.dou.. 2022. 6. 26.
[BigQuery] unixtime 을 timestamp 로 변환 웹사이트 분석에 없어서는 안될 분석 도구인 Google Analytics 가 기존 Universal Analytics (GA3) 에서 GA4 로 강제 전환이 된다. 2023년 7월부터는 GA3를 이용할 수 없게된다. 그리고 GA4로 전환이 되면서 여러 가지 장점이 있는데 그 중에 하나가 BigQuery를 무료로 이용할 수 있는 것이다. 그래서 BigQuery에 대해서 여러 회차에 나누어 글을 써보고자 한다. 이번에 다룰 내용은 숫자(int64 타입) 형태로 되어있는 시간 컬럼(event_timestamp)을 timestamp (날짜 형식 yyyy-mm-dd ) 으로 변환하는 것을 얘기하려 한다. GA4 를 Bigquery 와 연결하고 데이터를 살펴보면 다음과 같다. 이벤트의 발생 시간인 event_tim.. 2022. 6. 25.
[SQL] 데이터 PIVOT 하기 (presto, athena) 위 그림에서 파란색의 화살표와 같이 속성(attributtes)과 값(values) 들이 쌓여있는 형태에서, 속성들을 열(컬럼)의 형태로 변형하는 것을 피봇(pivot) 한다고 얘기한다. 그리고 그 반대의 과정을 언피봇(unpivot) 한다고 얘기한다. 이 포스팅에서는 presto (또는 athena) 에서 SQL로 피봇하는 것을 성명하려고 한다. (1) 아래와 같은 형태의 테이블이 있다. 실행을 위해서 sql 로 데이터를 아래와 같이 만들었다. with list (user_id, subject, score) as ( values (1, '국어', 90) , (1, '영어', 85) , (1, '수학', 60) , (2, '국어', 100) , (2, '영어', 50) , (2, '수학', 75) , (.. 2022. 6. 9.
[redash] 쿼리에서 필터 사용법 (filter, multi-filter) 본 글은 redash(리대시)에서 필터(drop-down list) 사용법에 관한 내용이다. 리대시에서는 drop-down list 를 사용할 때, (1) {{파라메터명}} 의 형식으로 사용되는 파라메터를 filter 로 사용하는 방식이 있고 (2) 쿼리문장에서 쿼리결과의 내용을 중심으로 필터를 사용할 수 있다. 이 글에서는 두 번째 방법인 쿼리문장에서 필터를 사용하는 방법에 대해서 설명할 것이고, 단순 선택 필터와 멀티 선택 필터 이렇게 두 가지 방법에 대해서 알아볼 것이다. 아래와 같이 list 라는 이름의 테이블이 있다고 가정하자. with list(uid, area, age_band) as ( values (1, '서울', '10대'), (2, '서울', '20대'), (3, '경기', '30대'.. 2022. 6. 7.
[SQL] 주단위 집계 꼭!! 주의해야할 점 (presto, athena) 이전 포스팅에서는 mysql 에서 주단위 집계시에 주의해야 할 점에 대해서 이야기 했었다. https://walkingfox.tistory.com/159 [MySql] 주단위 집계 꼭!! 주의해야할 점 쿼리(Query) 작업 시에 주 (Week) 단위로 집계를 해야한다면, 꼭 주의해야할 점이 하나 있다. 그것은 특정 일자가 어느 주에 속하는지에 따라서 다른년도의 주로 잘 못 계산되는 경우가 무척 많기 때 walkingfox.tistory.com 이번 글에서는 같은 내용을 presto 나 athena 에서 어떻게 처리할 지 이야기 해보겠다. presto 에서도 mysql에서와 같이 case when 구문을 이용하면 비슷한 방식으로 처리할 수 있지만, 역시나 sql 문장이 장황하게 길어진다. 대신 prest.. 2022. 6. 3.
[SQL] null 체크 (presto, athena) 어떤 DB (데이터베이스)던지, 표준 SQL 문법을 지원하기 때문에 특정 컬럼의 값이 null 일때의 처리는 동일한 구문으로 할 수 있다. 예를 들어 아래와 같이 테이블이 있다고 가정을 하면, create table tbl01 ( col1 varchar, col2 varchar ) col1 의 값을 출력하는데, col1의 값이 null 인경우 'none' 이라는 문자열로 출력하기를 원한다고 하면 아래와 같이 case when 구문으로 처리하면 어떤 db 에서든지 작동한다. select case when col1 is null then 'none' else col1 end as new_col1, col2 from tbl01 하지만, sql 문장이 길어져서 간결하게 만들려고 할 때에는 presto (athe.. 2022. 6. 3.
[SQL] 날짜 차이 계산하기 (presto, athena) Presto (또는 athena)에서 날짜 차이를 구하는 방법에 대해서 알아보자. 기본적으로 date_diff 라는 함수를 사용한다. date_diff( 'unit', '시작일자', '종료일자') 의 형식으로 사용하는데, 여기서 'unit'에 따라서 차이를 일단위로 계산할지 또는 월단위로 계산할지 등등을 정할 수 있다. unit 으로는 'YEAR', 'QUARTER', 'MONTH', 'WEEK', 'DAY', 'HOUR' , 'MINUTE', 'SECOND' 등을 사용할 수 있다. select date_diff('day', date('2022-01-01'), date('2022-02-01')) --> 결과 : 31 한가지 주의할 점은 '시작일자' 와 '종료일자'가 날짜 형식의 타입이어야 한다. date.. 2022. 5. 23.
[SQL] 주단위 집계 꼭!! 주의해야할 점 (MySql) 쿼리(Query) 작업 시에 주 (Week) 단위로 집계를 해야한다면, 꼭 주의해야할 점이 하나 있다. 그것은 특정 일자가 어느 주에 속하는지에 따라서 다른년도의 주로 잘 못 계산되는 경우가 무척 많기 때문이다. 특히 연의 마지막주와 연의 첫번째 주에서 이 오류를 자주 범하게 된다. 주 번호 (week number) 를 계산하는 방식에는 여러 가지가 있는데, 예를 들어서 매주 월요일이 있는 날짜의 주를 해당 주의 기준으로 본다고 하면, 위 달력에서 22년도 1월 1일과 22년도 1월 2일은 21년도의 52번째 주에 포함이 된다. 즉, 22년 1월 3일부터 22년도 첫번째주 (01주)가 되는 것이다. 그리고 반대의 경우도 발생할 수 있다. 특정 연도의 12월 30일 또는 31일이 다음 년도의 첫번째 주에 .. 2022. 5. 16.
[MySQL] Shell 에서 쿼리 결과를 CSV 파일로 저장 DB에 쿼리를 할 때 보통은 DB 클라이언트 프로그램을 사용한다. Workbench, DBeaver 와 같은.. 그러면 해당 툴에서는 쿼리의 결과를 쉽게 csv 파일로 저장을 할 수 있다. 하지만, 경우에 따라서 위 처럼 툴(tool)에서 쿼리 결과를 받을 수 없는 경우가 있을 수 있는데 이때는 Shell 에서 명령어로 그 결과를 CSV 로 저장할 수 있다. 아래와 같이... mysql -u"계정명" -p "DB명" "결과파일명" $ mysql -uroot -p test_db result.csv 각 항목마다 " " 로 감싸지 않을 경.. 2022. 5. 11.
Mysql 샘플링 (Sampling) : 랜덤 추출 Mysql 에서 랜덤(무작위)으로 몇개의 데이터를 추출하는 경우에 사용할 수 있는 쿼리 문장이다. order by 절에 rand() 함수를 적용하면 데이터가 랜덤한 순서로 추출이되면 limit 절로 그 갯수를 정하는 방식이다.  Select *From tb_sampleOrder by rand()Limit 100위의 쿼리는 tb_sample 이라는 테이블에서 랜덤으로 100개의 raw 를 추출하는 쿼리문장이며, 필요에 따라서 Where 절을 추가할 수 있다. Where 절이 추가되면, 조건이 적용된 데이터중에서 랜덤하게 100개를 추출한다.      [ 추가 ]그룹별로 랜덤하게 sampling 하기https://walkingfox.tistory.com/231 그룹별로 랜덤 sampling 하기예전에 단순히.. 2022. 4. 6.