SQL查询:按国家分组获取GMV最高的头部供应商
按国家维度获取GMV最高头部供应商的SQL实现
你现有代码已经完成了订单、供应商表关联和按国家+供应商维度的GMV聚合,核心缺省步骤是对聚合结果做分组内排序、取指定排名的记录,另外现有代码存在两处可优化/修正的点:
- 聚合后
GROUP BY已经完成维度去重,额外加的DISTINCT属于冗余逻辑,会增加不必要的计算开销,可以删掉 - GMV汇总字段别名笔误写成了
total_gmw,建议修正为total_gmv避免后续字段引用报错
实现方案(适配你使用的BigQuery引擎)
用窗口函数实现分组排序取Top N是性能最优、写法最简洁的方案,代码如下:
-- 第一步:先算出每个国家下各供应商的总GMV(复用你原有聚合逻辑,修正冗余和笔误) WITH vendor_country_gmv AS ( SELECT a.country_name, b.vendor_name, SUM(a.gmv_local) AS total_gmv FROM `my-project-67287.order1.order2` a JOIN `my-project-67287.vendor1.vendor2` b ON a.vendor_id = b.id GROUP BY a.country_name, b.vendor_name ) -- 第二步:按国家分区打排名,筛选目标名次的供应商 SELECT country_name, vendor_name, total_gmv FROM ( SELECT *, -- 同国家范围内按GMV从高到低排序打行号 ROW_NUMBER() OVER (PARTITION BY country_name ORDER BY total_gmv DESC) AS rank_num FROM vendor_country_gmv ) WHERE rank_num = 1; -- 取每个国家第1名,要取Top3就把条件改成 rank_num <= 3 即可
注意事项
- 如果需要保留并列排名的场景(比如两个供应商GMV相同同为国家第一,需要同时返回),把窗口函数从
ROW_NUMBER()替换为RANK()即可 - 如果需要取GMV最低的供应商,把窗口函数里的
ORDER BY total_gmv DESC改成ORDER BY total_gmv ASC就行
内容的提问来源于stack exchange,提问作者pammy09
相关产品推荐
相关产品推荐

