Изменение запроса, чтобы избежать «Агрегации агрегатов не допускаются» в Bigquery - PullRequest
1 голос
/ 25 марта 2019

Учитывая таблицы пользователей и заказов, мне нужно подсчитать пользователей, которые сделали свой первый заказ на следующий день после даты регистрации.

Мне удалось перечислить таких пользователей по следующему запросу:

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
ORDER BY
  registration_date ASC
LIMIT 5

В результате:

+------------+-----------+-------------------+------------------+
| first_name | last_name | registration_date | first_order_date |
+------------+-----------+-------------------+------------------+
| Albert     | Ellis     | 2013-04-11        | 2013-04-12       |
| Charles    | Moore     | 2014-04-29        | 2014-04-30       |
| Jimmy      | Payne     | 2014-07-01        | 2014-07-02       |
| Angela     | Stanley   | 2014-10-21        | 2014-10-22       |
| Marie      | Bishop    | 2014-11-15        | 2014-11-16       |
+------------+-----------+-------------------+------------------+

Теперь я не могу обернуться, считая их. Когда я пытаюсь что-то вроде:

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 ]

2 голосов
/ 25 марта 2019

Просто поместите ваш запрос в подзапрос. Вы уже выбираете клиентов, которые заказали на следующий день после регистрации. Таким образом, ответ - это количество строк в вашем запросе

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
1 голос
/ 25 марта 2019

Ниже для 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 голосов
/ 25 марта 2019

Почему бы просто не использовать условие 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;

COUNT(DISTINCT учитывает тот факт, что пользователи могут иметь несколько заказов за один день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...