2013-08-27 1 views
4

Nous avons un énorme tableau d'événements avec les utilisateurs s'inscrivant et jouant à nos jeux.Comment faire des sous-sélections dans BigQuery

Maintenant, je veux déterminer le deuxième jour de rétention pour chaque jour, c'est-à-dire le pourcentage de joueurs qui s'inscrivent la veille et qui jouent également le lendemain.

supposer Nous avons donc trois champs

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

Comment cela se fait dans la syntaxe BigQuery? c'est-à-dire que je voudrais la sortie suivante:

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

J'ai échoué avec des sous-sélections et des jointures mais cela doit être faisable!

Répondre

10

Comment au sujet de cette requête avec les données publiques:

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 

Cela me donne les résultats souhaités:

Results for the query

Notez la requête utilise STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day à plusieurs reprises, pour convertir les données de chaîne de source Un rendez-vous. Si je possédais les données, j'exécuterais au préalable un ETL sur la table, pour passer cette étape répétitive.

La requête: 2 tables joint

  • compte Première table combien de différents 'acteurs' lorsqu'ils sont présents dans une date précise. Notez le deuxième paramètre sur COUNT DISTINCT, pour que le compte soit précis.

  • Deuxième table REJOINT un jour donné avec le jour suivant, étant donné que le même acteur est présent dans les deux jours. Ensuite, vous pouvez compter le nombre d'acteurs présents dans un jour donné et le jour suivant.

  • En rejoignant les deux tables vous obtenez les deux comptes, et vous pouvez procéder à la division.

Il existe d'autres façons, ce n'est qu'une des nombreuses approches. Il est également possible d'optimiser cette requête encore plus loin.

Questions connexes