SQL计算分组变量占总数的份额

Posted

技术标签:

【中文标题】SQL计算分组变量占总数的份额【英文标题】:SQL calculate share of grouped variables to total count 【发布时间】:2021-10-09 09:38:44 【问题描述】:

这可能很容易,机器人不知何故我无法得到想要的结果:

我的数据如下所示:我有一张大桌子,上面有已售商品。每个项目都有一个指定的类别(此处为 A-D)和国家/地区。我想计算每个类别在欧洲销售了多少商品,以及该特定类别在总销售额中的份额是多少

我的数据如下所示:

country item_id item_cat
Europe 1 A
Europe 2 A
Europe 3 B
Europe 4 B
Europe 5 C
Europe 6 C
Europe 7 C
USA 8 D
USA 9 D
USA 10 D

我想要的输出如下:

country item_cat cat_sales total_sales share
Europe A 2 7 0.29
Europe B 2 7 0.29
Europe C 3 7 0.43

我尝试的是:

SELECT 
   country, 
   item_cat, 
   count(*) as cat_sales,
   count(*) OVER () as total_sales,
   cat_sales / total_sales as share
FROM data
where country='Europe'
group by item_cat

但是 SQL 告诉我不能在一个请求中分组和使用窗口化。 我怎么能解决这个问题? 提前致谢

【问题讨论】:

【参考方案1】:

有几种方法,一种是预先计算 CTE 中的总销售额,然后从中选择剩余的总销售额。

我不使用 impala,但是在标准 SQL 中这应该可以工作

with tot as (
    select *, 
      Count(*) over(partition by country) * 1.0 as total_sales
    from t
)
select country, item_cat, 
    Count(*) as cat_sales, 
    total_sales,
    Round(Count(*) / total_sales, 2) as Share
from tot
where country='europe'
group by country, item_cat, total_sales

【讨论】:

谢谢!不过有一个小问题:我是否应该在with (...) 语句中添加过滤器where country='europe',以减少负载并提高执行速度,如果它预先计算所有内容,还是仅在语句末尾和你的例子一样? 是的,你可以这样做,在这种情况下你不需要分区

以上是关于SQL计算分组变量占总数的份额的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery Legacy SQL(子查询?)中占总数的百分比

选择计算 SQL 的正/负值

SQL加入多个子查询 - 按日期计算打开/关闭

用于计算每天订单总数的 SQL 查询?

sql 用于计算每个帖子类型的帖子元行总数的SQL查询

sql 用于计算每个帖子类型的帖子元行总数的SQL查询