2017-07-15 1 views
0

J'ai eu du mal à obtenir le nombre de DAU et le nombre d'installations par jour décomposées par quelques données utilisateur telles que platform, OS_version, pays et quelques autres colonnes. L'idée est de la requête pour retourner quelque chose comme:Requête pour obtenir DAU et s'installe en utilisant self join

date |DAU|Installs|Platform|OS_ver|country| 2017-05-01 | 2 | 0 |Android |5.0 | US | 2017-05-01 | 1 | 1 |Android |6.0 | US | 2017-05-01 | 1 | 1 |Android |6.0 | JP | 2017-05-01 | 3 | 0 |Android |6.0 | MX | 2017-05-01 | 10| 0 |Android |5.0 | MX |

Comme vous pouvez le voir, DAU et installations seront réparties par ceux (et quelques autres) colonnes. Requête d'analyse assez simple. Toutes les informations se trouvent dans la même table. Les données doivent donc être manipulées et jointes par la table elle-même.

Une colonne qui n'affichera pas d'informations est la colonne d'événement, qui contient les événements pour installer et "screen" (l'événement screen est appelé chaque fois qu'un utilisateur ouvre un écran dans le jeu, même après la connexion, les événements "screen" seront utilisés pour compter la DAU). Mon idée initiale était de créer deux CTE, chacun ayant uniquement des enregistrements filtrés par les événements, un par des événements d'installation, et l'autre par des événements d'écran, puis j'extrait la partie jour de la date (qui dans horodatage unix) et créez une autre colonne dans chaque CTE, install_day pour compter les installations sur le CTE d'installation, et activity_day pour que le CTE DAU calcule #DAU. Après la création de ces deux CTE, je les joignais en utilisant la plate-forme comme condition: dau_cte.platform = install_cte.platform.

J'ai essayé de créer la requête de cette manière déjà de différentes façons, mais en utilisant la même logique que celle décrite ci-dessus, mais j'ai reçu un tas de données en double à chaque fois. Donc, au lieu de montrer mon code de requête pour aider à le corriger, j'aimerais savoir de la communauté quelle approche vous utiliseriez pour obtenir ces résultats.

BTW, cette requête sera en cours d'exécution dans Presto ... Merci d'avance!

Répondre

0

La requête doit être assez simple. La requête finale doit être groupée par date, country, platform et os_ver. Autant que je comprenne, deux métriques d'intérêt sont des comptes distincts d'un identifiant unique d'utilisateur (ou d'événement). Selon presto docs il n'y a pas d'agrégation de type COUNT_DISTINCT(X if Y), qui ne laisse effectuer que des count distincts dans les sous-requêtes, comme vous l'avez mentionné. Une requête qui suit fera exactement cela. Notez l'utilisation de COALESCE pour tenir compte des données manquantes.

SELECT 
     a.date, 
     a.platform, 
     a.os_ver, 
     a.country, 
     COALESCE(a.DAU, 0) as DAU, 
     COALESCE(b.installs, 0) as installs, 
FROM (
     SELECT 
       date, 
       platform, 
       os_ver, 
       country, 
       COUNT(DISTINCT <user_id>) AS DAU 
     FROM <table_name> 
     WHERE event_name = 'screen' 
     GROUP BY 1,2,3,4 
) a 
FULL JOIN (
     SELECT 
       date, 
       platform, 
       os_ver, 
       country, 
       COUNT(DISTINCT <user_id>) AS installs 
     FROM <table_name> 
     WHERE event_name = 'install' 
     GROUP BY 1,2,3,4 
) b 
ON 
     a.date = b.date 
     AND a.platform = b.platform 
     AND a.os_ver = b.os_ver 
     AND a.country = b.country 
+0

Merci Nikolay, je vais essayer plus tard et afficher les résultats. Bien rappelé sur le besoin de coalesce. Qu'en est-il lorsque j'ajoute plus de colonnes à cette requête, les nouvelles colonnes doivent-elles être ajoutées à la fois dans les sous-requêtes, à la clause group by, et après à la condition ON? –

+0

Oui, sauf si vous utilisez un autre identifiant unique pour grouper par ou UDAF pour faire le compte distinct. – Nikolay