2013-08-27 2 views
4

우리는 사용자가 우리 게임을 등록하고 즐기는 거대한 이벤트 테이블을 가지고 있습니다.BigQuery에서 subselect를 수행하는 방법

이제 각 날의 두 번째 요일 보류를 결정하고 싶습니다. 요일 보류는 요일을 등록한 선수의 백분율입니다.

그래서 우리는 세 개의 필드이 BigQuery의 구문에서 수행되는 방법

timestamp ts 
int userId 
int eventId    (I.e. 1 = Register, 2 = Login) 

가 있다고 가정? 즉, 다음 출력을 원합니다 :

Date   Register Logins day after % Second day retention 
2013-08-23 25 563  4 567    17.8 

하위 선택 및 조인에 실패했지만 실행 가능해야합니다!

답변

10

어떻게 공공 데이터와이 쿼리에 대해 :

Results for the query

참고 쿼리가 소스 문자열 데이터를 변환, STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day 여러 번 사용

SELECT 
    a.day, first_day, return_next_day, 
    integer((return_next_day/first_day) * 100) percent 
FROM (
    SELECT COUNT(DISTINCT actor, 50000) first_day, 
    STRFTIME_UTC_USEC(
     UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day, 
    FROM 
    [publicdata:samples.github_timeline] 
    GROUP BY day) a 
JOIN (
    SELECT 
    COUNT(*) return_next_day, day 
    FROM (
    SELECT 
     a.day day, a.actor, b.day, b.actor 
    FROM (
     SELECT 
     STRFTIME_UTC_USEC(
      UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day, 
     MAX(STRFTIME_UTC_USEC(86400000000 + UTC_USEC_TO_DAY(
      PARSE_UTC_USEC(created_at)), "%Y-%m-%d")) dayplus, 
     actor 
     FROM 
     [publicdata:samples.github_timeline] 
     GROUP EACH BY actor, day) a 
    JOIN EACH (
     SELECT 
     STRFTIME_UTC_USEC(
      UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day, 
     actor 
     FROM 
     [publicdata:samples.github_timeline] 
     GROUP EACH BY actor, day) b 
     ON a.actor = b.actor 
     AND a.dayplus = b.day 
    ) 
    GROUP BY day) b 
    ON a.day = b.day 

이 나에게 원하는 결과를 제공합니다 날짜. 데이터를 소유 한 경우이 반복적 인 단계를 건너 뛰기 위해 테이블에 대해 ETL을 실행합니다.

  • 첫 번째 테이블 수가 얼마나 많은 다른 '배우'어디에 존재하는 특정 날짜 :

    쿼리는 두 테이블을 조인. COUNT DISTINCT의 두 번째 매개 변수에 유의하여 정확한 계산을하십시오.

  • 두 번째 테이블 두 배우자 모두 같은 배우가 양쪽에 존재할 경우 다음 날과 함께 주어진 날을 선택합니다. 그런 다음 주어진 날과 다음 날에 출연하는 배우의 수를 계산할 수 있습니다.

  • 두 테이블에 모두 가입하면 두 카운트가 모두 나뉘어 진행할 수 있습니다.

여러 가지 방법 중 하나 일뿐입니다. 이 쿼리를 더욱 최적화 할 수도 있습니다.

관련 문제