【问题标题】:BigQuery: How to find Scaled Average Weekly Sales?BigQuery:如何找到按比例缩放的平均每周销售额?
【发布时间】:2020-11-18 17:12:09
【问题描述】:

解决方案: 我们的最终目标是通过以下公式获得 Scaled AverageWeeklySales(AWS):

Scaled AWS = (Number of Weeks article has had a record within the store / maximum Number of Weeks in data) * (AWS /  Number of Weeks)

输入“table_a”结构:

Store   Article     Date    Week    Year    Sales
xx      xx          xx      xx      xx      xx

试用: 已经构建了一个查询,直到找到 AWS [在商店级别] 并被困在那里继续前进。由于我是新手,我不确定如何通过 BigQuery SQL 实现这种 Scaled AWS。需要帮助!

WITH total_weekly_sales AS (
SELECT
  Store,
  Week,
  SUM(Sales) AS TotalWeeklySales
FROM
  table_a
GROUP BY
  Store,
  Week)
SELECT
  Store,
  AVG(TotalWeeklySales) AS AverageWeeklySales
FROM
  total_weekly_sales tws
GROUP BY
  Store

样本数据:

Store   Article     Date            Week        Year    Sales
11      aa          2019-07-01      202001      2020    4.9
11      bb          2019-07-07      202001      2020    22.5
11      cc          2019-07-08      202002      2020    10.4
12      aa          2019-07-01      202001      2020    5.3
12      bb          2019-07-07      202001      2020    20.2

评论查询:

  • AWS - 表示平均每周销售额[从给定的数据中得出 商店级别,正如我在“Tried Out”会议中提到的那样 问题,至于在商店级别找到 totalweeklysale 并获得 它的平均值给 AWS]
  • 周数 - 在商店级别[对于每个商店,多少周数据 展示。 例如 对于商店 11,此变量值为 2,而对于 存储12,这个变量值为1]
  • 数据中的最大周数 - 例如: 从我们的样本数据中, 此值将是 2 [说明: 对于每个商店,必须 计算数据存在的总周数并取最大值 所有商店的周数。在这里,11 号商店有 2 周的时间 总计,而 Store 12 总共有 1 周。所以,这里的最大值 将是 2,它被分配为此变量的值]

期望的结果: Scaled AWS Formula Part_1 结果[文章在商店中有记录的周数/数据中的最大周数]

Store   part_1_value    
11      1.5 (3/2)
12      1 (2/2)

按比例缩放的 AWS 公式 Part_2 结果 [AWS / 周数]

Store   part_2_value    
11      18.9 (37.8/2)
12      25.5 (25.5/1)

最终输出为: [Part_1 * Part_2]

Store   ScaledAverageWeeklySales    
11      28.35 (1.5*18.9)
12      25.5 (1*25.5)

总的来说,我们的最终结果应该是在商店级别。 提前致谢!

【问题讨论】:

  • 样本数据和预期结果将有助于解释公式。正如您所知,目前尚不清楚“周数”是什么意思,或者“数据中的最大周数”是如何计算的。也不清楚结果处于什么水平。 . .文章,商店,还有什么?并且数据中没有任何内容称为AWS
  • @GordonLinoff 已根据您的要求通过添加详细信息来编辑问题。
  • 在编写查询代码以帮助您之前,我试图了解您的逻辑。您能解释一下为什么在商店 11 中文章在商店中有记录的周数是 3 吗?
  • @AlexandreMoraes 谢谢,期待您的解决方案!要回答您的问题,这意味着该特定商店的商品数量。例如。对于 Store 11,存在的唯一文章总数为 3,而对于 Store 12,该值为 2。

标签: sql group-by google-bigquery subquery week-number


【解决方案1】:

在您澄清之后,我能够创建一个查询来计算您正在寻找的内容。

我已将您提供的数据与WITH 语句以及BigQuery 中的MAXCOUNT 聚合内置方法一起使用。下面是查询,

WITH unique_articles AS (
SELECT Store, COUNT(DISTINCT Article) as uniq_art FROM `test-proj-261014.bq_load_codelab.sales_week`
GROUP BY Store
),
max_weeks_st AS (
#not possible to use DATE_DIFF cos the format of the date, the number of weeks would be 1 for the sample data
#so WEEK column will be used instead
SELECT Store, COUNT(Distinct Week) as max_weeks_st  FROM `test-proj-261014.bq_load_codelab.sales_week` 
group by Store
), 
#below returns a struct. So in order to access the int64 value name_of_struct.max_weeks_data
max_weeks_data AS(
SELECT MAX(a.max_weeks_st) AS max_weeks_data FROM max_weeks_st a
),
sum_sales AS (
SELECT Store, SUM(sales) as sum_sales  FROM `test-proj-261014.bq_load_codelab.sales_week` 
GROUP BY Store
), 
final_data AS(
select a.Store, a.uniq_art, b.max_weeks_st,c.sum_sales, max_weeks_data  FROM  unique_articles a LEFT JOIN sum_sales c USING(Store)
LEFT JOIN max_weeks_st b USING(Store) CROSS JOIN  max_weeks_data 
)
SELECT Store,((uniq_art/max_weeks_data.max_weeks_data)*(sum_sales/ max_weeks_st)) as AWS_result  FROM final_data a

和输出,

Row Store   AWS_result
1   11      28.35
2   12      25.5

注意 max_weeks_data 是一个 struct。因此,要访问其值,必须遵循以下语法:name_of_struct.max_weeks_data。此外,请注意,您描述的每个变量都是在临时表中计算的,始终使用用于连接表的 Store ID。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多