2016-11-03 2 views
1

Google BigQuery에 연결된 Firebase Analytics로 분석을 수집합니다.Google BigQuery와 다른 열의 키 값 쿼리

내가 BigQuery의에서 다음 데이터가 (불필요한 열/행이 중단되어이 데이터 세트는 https://bigquery.cloud.google.com/table/firebase-analytics-sample-data:ios_dataset.app_events_20160607?tab=preview과 유사) :

  • 이벤트 :

    | event_dim.name | event_dim.params.key | event_dim.params.value.string_value | 
    |----------------|----------------------|-------------------------------------| 
    | read_post  | post_id    | p_100        | 
    |    | group_id    | g_1         | 
    |    | user_id    | u_1         | 
    | open_group  | post_id    | p_200        | 
    |    | group_id    | g_2         | 
    |    | user_id    | u_1         | 
    | open_group  | post_id    | p_300        | 
    |    | group_id    | g_1         | 
    |    | user_id    | u_3         | 
    

    내가 다음 데이터를 조회 할 이름

  • 사용자 ID
  • 그룹 ID

나는 다음과 같은 쿼리를 시도 :

SELECT 
    event_dim.name, 
    FIRST(IF(event_dim.params.key = "user_id", event_dim.params.value.string_value, NULL)) WITHIN RECORD user_id, 
    FIRST(IF(event_dim.params.key = "group_id", event_dim.params.value.string_value, NULL)) WITHIN RECORD group_id 
FROM 
    [xxx:xxx_IOS.app_events_20161102] 
LIMIT 
    1000 

위의 질의에 대한 문제가 WITHIN 수정과 SELECT 문은 결과의 목록을 반환하기 때문에 집계 함수 FIRST가 잘못된 결과를 제공하는 것입니다.함수는 첫 번째 행의 경우에만 올바른 결과를 제공합니다. ("표시 옵션"에서 "사용 레거시 SQL을"취소) standard SQL를 사용

답변

4

당신이 할 수 있습니다

SELECT 
    event_dim.name, 
    (SELECT value.string_value FROM UNNEST(params) 
    WHERE key = 'user_id') AS user_id, 
    (SELECT value.string_value FROM UNNEST(params) 
    WHERE key = 'group_id') AS group_id 
FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`, 
    UNNEST(event_dim) AS event_dim 
LIMIT 1000; 

만 모두 'user_id''group_id'이 행을 원하는 경우에, 당신은 NULL 값을 필터링 할 수 있습니다 :

SELECT * FROM (
    SELECT 
    event_dim.name, 
    (SELECT value.string_value FROM UNNEST(params) 
    WHERE key = 'user_id') AS user_id, 
    (SELECT value.string_value FROM UNNEST(params) 
    WHERE key = 'group_id') AS group_id 
    FROM `firebase-analytics-sample-data.ios_dataset.app_events_20160607`, 
    UNNEST(event_dim) AS event_dim 
) 
WHERE user_id IS NOT NULL AND group_id IS NOT NULL 
LIMIT 1000; 
+0

그래, 완벽하게 작동하는 것 같습니다. 데이터는 미리보기와 다른 순서로 표시되지만 큰 문제는 아닙니다. 이 쿼리에 여러 테이블 (동일한 스키마 사용)을 추가 할 수있는 가능성을 알고 계십니까? – Timon

+1

물론, [와일드 카드 테이블] (https://cloud.google.com/bigquery/docs/wildcard-tables)에 관심이 있거나 'FROM MyTable' 대신'FROM (SELECT * FROM MyTable) UNION ALL SELECT *에서 MyOtherTable UNION ALL ...)'. [마이 그 레이션 가이드] (https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql#comma_operator_with_tables)에는 UNION ALL과 함께 몇 가지 예가 있습니다. –

+0

아아, 와일드 카드 테이블에 대해 방금 읽었습니다. 그게 좋은 기능입니다! 고마워요! – Timon