2
votes

Modification de la requête pour éviter "Les agrégations d'agrégations ne sont pas autorisées" dans Bigquery

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


0 commentaires

3 Réponses :


2
votes

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


2 commentaires

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



0
votes

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.


3 commentaires

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.



2
votes

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


0 commentaires