Compte tenu des tables d'utilisateurs et de commandes, je dois compter les utilisateurs qui ont passé leur première commande le jour suivant la date d'inscription.
J'ai réussi à répertorier ces utilisateurs avec la requête suivante:
SELECT count(date_diff(min(orders.order_date), users.registration_date, DAY) = 1) FROM `users_table` as users JOIN `orders_table` as orders ON users.id = orders.user_id
3 Réponses :
Mettez simplement votre requête dans une sous-requête. Vous choisissez déjà les clients qui ont commandé le lendemain de l'inscription. La réponse est donc un certain nombre de lignes dans votre requête
select count(1) from ( SELECT users.first_name as first_name, users.last_name as last_name, users.registration_date as registration_date, min(orders.order_date) as first_order_date FROM `users_table` as users JOIN `orders_table` as orders ON users.id = orders.user_id GROUP BY first_name, last_name, registration_date HAVING date_diff(first_order_date, registration_date, DAY) = 1 ) x
Cela a fonctionné, merci. Les SELECT imbriqués sont-ils une pratique courante? Ou il pourrait y avoir une solution plus élégante ici?
C'est une pratique très courante. Bien sûr, il existe différentes solutions à votre problème, l'une d'elles est la table imbriquée
Pourquoi ne pas simplement utiliser une condition JOIN
?
SELECT COUNT(DISTINCT u.id) FROM `users_table` u JOIN `orders_table` o ON u.id = o.user_id AND date_diff(o.order_date, u.registration_date, DAY) = 1;
Le COUNT (DISTINCT
tient compte du fait que les utilisateurs peuvent avoir plusieurs commandes en un jour.
L'utilisateur a reçu plusieurs commandes avec des dates différentes. J'ai besoin de la date de la première commande pour comparaison. En essayant "date_diff (min (orders.order_date), users.registration_date, DAY)", je reçois "Fonction d'agrégation MIN non autorisée dans la clause JOIN ON".
Un utilisateur peut-il passer une commande avant cette date?
Il y a plusieurs commandes par utilisateur. Par exemple. l'utilisateur s'était enregistré le 1er novembre et avait passé 3 commandes les 2 novembre, 5 novembre et 21 novembre. Je dois compter ceux qui ont passé leur première commande directement le jour suivant après l'inscription. Ils ne peuvent pas passer de commandes avant l'inscription.
Voici pour BigQuery Standard SQL
#standardSQL SELECT COUNT(1) next_day_order_users FROM `project.dataset.users_table` AS users JOIN ( SELECT user_id, MIN(order_date) first_order_date FROM `project.dataset.orders_table` GROUP BY user_id ) AS orders ON users.id = orders.user_id WHERE DATE_DIFF(first_order_date, registration_date, DAY) = 1