본문 바로가기

쿼리21

[BigQuery] 최신의 데이터를 가져오는 3 가지 방법 먼저, 아래와 같은 데이터가 있다고 가정을 합니다. A 파트의 데이터가 우리가 갖고 있는 user_id 기준으로 중복이 있는 tbl_user 라는 테이블입니다.B 파트는 우리가 사용하고자 하는 user_id 기준으로 최신의 정보만 있는 "만들려고 하는 테이블" 입니다. 방법 1첫번째 방법은 사용자(user_id)별로 updated_at 기준으로 번호를 생성하고, 최신의 데이터를 가져오는 방법입니다.withuser_info as ( select user_id , name , phone , address , hobby , row_number() over(partition by user_id order by updated_at desc) as.. 2024. 12. 9.
그룹별로 랜덤 sampling 하기 예전에 단순히 랜덤 sampling 을 하는 SQL 을 공유한 적이 있다. https://walkingfox.tistory.com/149 Mysql 샘플링 (Sampling) : 랜덤 추출Mysql 에서 랜덤(무작위)으로 몇개의 데이터를 추출하는 경우에 사용할 수 있는 쿼리 문장이다. order by 절에 rand() 함수를 적용하면 데이터가 랜덤한 순서로 추출이되면 limit 절로 그 갯수를 정하는walkingfox.tistory.com 이번에는 데이터가 그룹별로 있을 경우 그룹별로 랜덤하게 sampling 하는 방법에 대해서 적어보려 한다. 아래와 같은 tbl_user 테이블이 있다고 가정한다.연령대와 유져id 로 구성되어 있는age_groupuser_id10대12310대23420대345......6.. 2024. 8. 27.
Recursive Query (재귀쿼리) 아래의 쿼리는 mysql 8.x 버젼대에서 실행한 내용입니다. (recursive 쿼리를 지원하는) 1. 테이블 생성 HTML 삽입 미리보기할 수 없는 소스 위 코드를 실행하면 sample 데이터를 생성할 수 있으며, 그 데이터는 아래의 구조를 나타낸 데이터입니다. 2. 하향탐색 재귀쿼리 (기준 node 에서 아래 방향으로 탐색) HTML 삽입 미리보기할 수 없는 소스 -- start 부분에서는 하향검색을 시작할 노드를 설정하는 부분이다. -- repeat 부분에서는 위에서 설정한 초기 값이 재쿼리의 타이틀인 find_division 에 들어가고 그 값을 기준으로 다시 division 을 조인한다. division 테이블이 하위 코드를 탐색하게 되는 테이블이라 d.upper_division_code 를.. 2024. 3. 12.
[SQL] 월별로 잔존타입별 고객수 계산 아래와 같은 테이블이 있다고 가정하고, -- 테이블 명세 : tbl_order customer_id : 고객 아이디 (int) order_date : 주문일자 (date) order_id : 주문번호 (int) order_price : 주문금액 (int) 계산하려고 하는 것은 아래의 고객 타입별 고객 수입니다. -- 이번달 구매한 고객 신규고객 : 이번달 첫구매한 고객 잔존고객 : 전월과 이번달 구매한 고객 귀환고객 : 신규고객이 아니면서, 전월 구매하지 않은 고객이 이번달 구매한 고객 -- 이번달 구매하지 않은 고객 이탈고객 : 전월 구매한 고객이 이번달 구매하지 않은 고객 HTML 삽입 미리보기할 수 없는 소스 2024. 1. 25.
[BigQuery] 연속된 일자 생성하기 빅쿼리에서는 generate_date_array 라는 함수를 사용하면, 일련의 날짜 데이터에 대한 배열을 결과 값으로 얻을 수 있다. 이를 응용하면, 특정 기간안에 주별 데이터(주별 시작일, 연도, 주넘버)를 구하여 여러 쿼리에 활용할 수 있다. declare from_date, to_date date; set from_date = date_sub('2023-01-01', interval 375 day); set to_date = '2023-12-31'; select date_trunc(date(base_dt), week(sunday)) as current_dd , format_date('%Y', base_dt) as week_year , format_date('%U', base_dt) as week_n.. 2023. 10. 10.
[BigQuery] 빅쿼리에서 values 절을 구현해보자. MySQL, PostgresSQL 등에서는 Values 절을 이용하여 아래와 같이 외부 text를 테이블 처럼 사용할 수 있다. with list (id, name) as ( values (1004007, '홍길동'), (1002147, '장동건'), (1004493, '현빈'), (1007978, '이서진'), (1005218, '원빈'), (1005507, '이병헌') ) select id , name from list MySQL 에서는 구문이 살짝 다르긴 하다. 요렇게 `ROW` 라는 키워드를 붙여줘야 한다. values ROW (1004007, '홍길동'), 하지만 BigQuery에서는 Values 를 위처럼 사용할 수는 없다. 그래서 아래와 같이 사용해야 한다. (1) 컬럼이 하나인 경우 sel.. 2023. 2. 20.
[BigQuery] 빅쿼리에서 min_by, max_by 쿼리 문장에서 많이 사용하는 그룹 함수 중에 하나가 min(), max() 함수입니다. 아래와 같은 학생별 시험 성적 테이블이 있다고 가정을 합니다. 학생별로 가장 높은 점수와 가장 낮은 점수를 구하는 쿼리를 작성해볼까요. 아래와 같이 계산할 수 있습니다. select user_id , min(score) as min_score , max(score) as max_socre from tbl_score group by user_id 이번에는 학생별로 점수가 가장 낮은 과목은 무었인지 구하는 쿼리를 작성해볼까요. 이럴때 사용할 수 있는 함수가 min_by 입니다. 아시겠지만, min(subject) 라고 쓸 수 없는 이유는 이 함수는 알파벳의 사전순으로 가장 작은 값을 가져오는 내용이기 때문입니다. sele.. 2023. 1. 30.
[BigQuery] 빅쿼리에서 여러 날짜별 테이블을 한 쿼리로 아래 사진에서 보는 바와 같이 GA4를 BigQuery 에 연결하면, 일자별로 테이블이 나뉘어서 데이터들이 저장된다. 그래서 여러 날짜에 걸쳐서 데이터를 분석하고자 하면, 아래와 같이 할 수도 있지만 너무 비효율적이다. (두어개의 테이블만 사용한다면 괜찮지만, 몇달치를 쿼리한다고 하면 ??) SELECT * FROM `coherent-fx-234207.analytics_308890446.events_20220816` union SELECT FROM `coherent-fx-234207.analytics_308890446.events_20220815` union SELECT FROM `coherent-fx-234207.analytics_308890446.events_20220814` 그래서 빅쿼리(BigQu.. 2022. 8. 17.
[MySQL] date_trunc 함수를 구현하자. date_trunc 라는 함수는 특정일자의 시작이 되는 unit 의 첫날을 가져오는 함수이다. 예를 들면 date_trunc('week', '2022-08-05') 라고 하면 2022년 8월 5일이 있는 주(unit) 의 첫날인 '2022-08-01' 보여준다. date_trunc('month', '2022-04-25') 라고 하면 2022년 4월 25일이 있는 월(unit) 의 첫날인 '2022-04-01'을 출력한다. 그런데 MySQL 에서는 안타깝게도 date_trunc 함수를 지원하지 않는다. 월의 첫날은 date_trunc 함수를 사용하지 않아도 구하는 것이 어렵지는 않지만, 주의 첫날을 구하는 것은 까다로울 수 있다. 그래서 아래와 같이 응용을 하여 구해볼 수 있다. select STR_TO_.. 2022. 8. 17.
[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.