代码之家  ›  专栏  ›  技术社区  ›  Vadim Tikanov

更改查询以避免在Bigquery中出现“不允许聚合的聚合”

  •  0
  • Vadim Tikanov  · 技术社区  · 7 年前

    给定用户和订单表,我需要统计注册日期后第二天第一次下单的用户。

    我通过以下查询列出了这些用户:

    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
    

    我收到“不允许聚合的聚合”错误。如何修改查询以解决此问题?

    0 回复  |  直到 7 年前
        1
  •  3
  •   Mikhail Berlyant    7 年前

    下面是BigQuery标准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
    
        2
  •  2
  •   lypskee    7 年前

    只需将查询放入子查询。您已经在选择注册后第二天订购的客户。所以答案是查询中的许多行

    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
    
        3
  •  0
  •   Gordon Linoff    7 年前

    为什么不直接使用 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 用户可以在一天内收到多份订单。