问题描述
我正在对 Google Big query 进行查询,我已经加入了 2 个表并创建了一个新列“total gmv”,使用“SUM”来表示总收入,现在我只想显示前 2 个供应商 GROUP在我的查询中按国家/地区。
我设法按国家/地区和供应商名称显示 total_gmv 组,但我想过滤以仅显示每个国家/地区的前 2 个供应商。
我使用的代码
SELECT Ord.country_name,vn.vendor_name,round(sum(Ord.gmv_local),2) as total_gmv FROM ORDERS as Ord
left join `primeval-falcon-306603.foodpanda_BI_Exercise.vendors` as vn
ON Ord.vendor_id = vn.id
GROUP BY Ord.country_name,vn.vendor_name
ORDER BY Ord.country_name,total_gmv desc
country_name | vendor_name | total_gmv |
---|---|---|
新加坡 | 一所房子 | 1583.25 |
新加坡 | B 屋 | 1236.35 |
新加坡 | C 屋 | 1153.27 |
新加坡 | D 屋 | 596.21 |
香港 | H 屋 | 1888.75 |
香港 | K 屋 | 755.78 |
曼谷 | BB 屋 | 936.12 |
有没有办法只显示每个国家/地区的前 2 个供应商?
我的目标表应该是这样的,只显示前 2 个
我正在使用 Google bigquery,但“TOP 2”功能似乎不起作用?
country_name | vendor_name | total_gmv |
---|---|---|
新加坡 | 一所房子 | 1583.25 |
新加坡 | B 屋 | 1236.35 |
香港 | H 屋 | 1888.75 |
香港 | K 屋 | 755.78 |
曼谷 | BB 屋 | 936.12 |
解决方法
使用echo -n "some simple words" | base64
:
ROW_NUMBER
,
下面是要走的路 - 在您的代码中只多加一行QUALIFY ROW_NUMBER() OVER(PARTITION BY country_name ORDER BY total_gmv DESC) <= 2
所以,现在整个查询将是
SELECT
Ord.country_name,vn.vendor_name,round(sum(Ord.gmv_local),2) as total_gmv
FROM ORDERS as Ord
LEFT JOIN `primeval-falcon-306603.foodpanda_BI_Exercise.Vendors` as vn
ON Ord.vendor_id = vn.id
GROUP BY Ord.country_name,vn.vendor_name
QUALIFY ROW_NUMBER() OVER(PARTITION BY country_name ORDER BY total_gmv DESC) <= 2
ORDER BY Ord.country_name desc,total_gmv desc
如果应用于您问题中的样本数据 - 输出为