基于BigQuery实现按国家/月度的毛营收Top10产品类型统计
正确实现按国家/月度统计毛营收Top10产品类型的BigQuery SQL
核心实现逻辑
要实现每个国家/月度的毛营收Top10产品类型统计,需先按维度聚合计算营收,再用窗口函数对每个分组内的产品类型排名,最后筛选排名前10的记录。以下是可直接运行的BigQuery SQL:
WITH revenue_summary AS ( -- 第一步:按月度、国家、产品类型聚合计算毛营收 SELECT FORMAT_DATE("%Y-%m", t0.order_create_date) AS month, t0.site_country AS country, p0.product_type AS product_type, SUM(t0.item_sale_price) AS gross_revenue FROM `transactions` t0 LEFT JOIN `products` p0 ON t0.item_id = p0.item_id GROUP BY month, country, product_type ), ranked_products AS ( -- 第二步:按月度+国家分组,对产品类型按营收降序排名 SELECT *, -- 若允许并列营收的产品共享排名,用DENSE_RANK();若严格排序用ROW_NUMBER() RANK() OVER (PARTITION BY month, country ORDER BY gross_revenue DESC) AS revenue_rank FROM revenue_summary ) -- 第三步:筛选每个分组内排名前10的记录 SELECT month, country, product_type, gross_revenue FROM ranked_products WHERE revenue_rank <= 10 ORDER BY month, country, revenue_rank;
原SQL问题分析
第一段SQL的明显错误
- 未定义
rn字段,直接在WHERE子句中使用rn <=10会触发语法错误; - 缺少
GROUP BY子句,使用聚合函数SUM()时,所有非聚合字段必须出现在GROUP BY中; LIMIT关键字后未指定具体数值,语法不完整。
针对第二段SQL的常见问题推测
虽然无法查看图片内容,但这类需求的常见错误包括:
- 窗口函数的
PARTITION BY未同时指定month和country,导致排名逻辑不是按国家/月度分组; - 先执行排名再进行营收聚合,导致统计结果错误;
- 使用了错误的窗口函数类型(比如需要保留并列排名时误用
ROW_NUMBER())。
内容的提问来源于stack exchange,提问作者user19774345
相关产品推荐
相关产品推荐

