繁体   English   中英

BigQuery - 使用 WHERE 子句按日期分组

[英]BigQuery - Grouping by date with a WHERE clause

我的目标是搜索某些产品,计算每种产品的总数,然后按天对每个产品进行分组。

架构是这样的:

行项目.sku 创建时间
产品1 2020-04-02T13:22:44
产品2 2020-04-02T05:01:22
产品2 2020-04-03T14:21:10

我的查询如下:

SELECT
  EXTRACT(DAY
  FROM
    CAST(`order`.created_at AS DATETIME)) AS day_extracted,
  EXTRACT(MONTH
  FROM
    CAST(`order`.created_at AS DATETIME)) AS month_extracted,
  `order`.line_items.sku AS sku
FROM
  `mydatabase`
WHERE
  `order`.line_items.sku = "product 1"
  OR `order`.line_items.sku = "product 2"

数据如下:

day_extracted 提取月 存货
1个 5个 2个 产品1
2个 4个 1个 产品2
2个 4个 1个 产品1

这很好并且有效,但我遇到了需要对产品进行分组并每天计算每个产品总数的问题。

我究竟做错了什么? 如果我添加

  GROUP BY month_extracted, day_extracted

对于查询,出现另一个错误

SELECT list expression references `order`.line_items which is neither grouped nor aggregated at [8:3]

第 8 行是:

`order`.line_items.sku AS sku

评估一般 SQL 查询的顺序是这样的在此处输入图像描述

这意味着 group by 子句甚至不知道什么是month_extracted, day_extracted 因此,为了解决这个问题,要么将整个 exp EXTRACT(..放在 Group by OR 中。使用子查询。还有一条规则,即 SELECT 中不属于 GROUP BY 的任何内容都应应用 AGGREGATE function。因此,在您那里这不是错误。

select 
       day_extracted,
       month_extracted,
       any_value(sku) AS sku -- i used any_value to fix it, you can use any other agg. function as per your logic
 from (
SELECT
  EXTRACT(DAY
  FROM
    CAST(`order`.created_at AS DATETIME)) AS day_extracted,
  EXTRACT(MONTH
  FROM
    CAST(`order`.created_at AS DATETIME)) AS month_extracted,
    `order`.line_items.sku as Sku
  
FROM
  `mydatabase`
WHERE
  `order`.line_items.sku = "product 1"
  OR `order`.line_items.sku = "product 2"
) as _table
group by day_extracted,month_extracted

Mr.Batra 带我进入子查询的兔子洞,这让我找到了我的解决方案。 了解执行查询的顺序现在也更有意义了。

SELECT day_extracted,month_extracted,Sku,count(*) FROM 
    (
SELECT
    EXTRACT(DAY
    FROM
      CAST(`order`.created_at AS DATETIME)) AS day_extracted,
    EXTRACT(MONTH
    FROM
      CAST(`order`.created_at AS DATETIME)) AS month_extracted,
    `order`.line_items.sku AS Sku
  FROM
    `mydatabase`
  WHERE
    `order`.line_items.sku = "product1"
    OR `order`.line_items.sku = "product2"
    ) AS temp
    GROUP BY temp.Sku,day_extracted,month_extracted
    ORDER BY day_extracted

这给了我这种格式的数据:

day_extracted 提取月 斯库 col1
1个 2个 产品1 41
1个 2个 产品2 55
2个 2个 产品1 91

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM