PostgreSQL多表关联查询如何实现各区域销量TOP2商品统计
错误原因
- 表关联条件错误:和
dim_product表关联时,错误写为FS.territory_id=DT.territory_id,没有关联商品ID字段,导致事实表每一行都匹配了全部商品行,产生笛卡尔积,最终统计出来的销量全部是区域总销量,和商品无关。 - 缺少分组取TOP N逻辑:原SQL仅做了全局排序,没有按区域分组筛选前2名商品的逻辑。
修正后SQL
-- 先聚合每个区域每个商品的总销量,再做分区排序取前2 WITH region_product_sales AS ( SELECT DT.region, DP.product_name, SUM(FS.quantity) AS total_sales, -- 按区域分组,组内按销量倒序排名 ROW_NUMBER() OVER (PARTITION BY DT.region ORDER BY SUM(FS.quantity) DESC) AS rank_num FROM fact_sales FS INNER JOIN dim_territory DT ON FS.territory_id = DT.territory_id -- 修正商品表关联条件,关联商品ID INNER JOIN dim_product DP ON FS.product_id = DP.product_id GROUP BY DT.region, DP.product_name ) SELECT region, product_name, total_sales FROM region_product_sales WHERE rank_num <= 2 ORDER BY region, total_sales DESC;
说明:如果需要保留并列排名的结果,把
ROW_NUMBER()换成RANK()即可。
运行结果
| region | product_name | total_sales |
|---|---|---|
| AUS | mountain bike | 5 |
| AUS | patch kit | 4 |
| FRN | logo | 10 |
| GRMN | mountain bike | 5 |
| GRMN | patch kit | 4 |
内容的提问来源于stack exchange,提问作者Napier
相关产品推荐
相关产品推荐

