sql - 有没有办法在“分组”国家之后只显示查询的前 2/n 个?- 大查询 SQL
问题描述
我正在对 Google Big 查询进行查询,我加入了 2 个表并创建了一个新列“total gmv”,使用“SUM”来表示总收入,现在我只想显示前 2 个供应商,GROUP BY country我的查询。
我设法按 COUNTRY 和 vendor_name 显示 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
国家的名字 | 供应商名称 | 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”功能不起作用?
国家的名字 | 供应商名称 | total_gmv |
---|---|---|
新加坡 | 一个房子 | 1583.25 |
新加坡 | B楼 | 1236.35 |
香港 | H楼 | 1888.75 |
香港 | K楼 | 755.78 |
曼谷 | BB之家 | 936.12 |
解决方案
使用ROW_NUMBER
:
WITH cte AS (
SELECT Ord.country_name, vn.vendor_name, ROUND(SUM(Ord.gmv_local), 2) AS total_gmv,
ROW_NUMBER() OVER (PARTITION BY Ord.country_name
ORDER BY SUM(Ord.gmv_local) DESC) rn
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
)
SELECT country_name, vendor_name, total_gmv
FROM cte
WHERE rn <= 2
ORDER BY country_name, total_gmv DESC;
推荐阅读
- javascript - 谷歌图表树形图工具提示不起作用
- python-3.x - 我怎样才能用beautifulsoup从维基百科表中提取一条数据
- javascript - 对组件外部的触摸事件做出本机反应
- javascript - 谷歌日历日期字符串到 JS 日期对象
- node.js - Typeorm:分页关系
- vba - 如何用vba选择li-tag?
- git - Git 凭证助手不适用于 linux 的 windows 子系统
- arduino - 解码 433Mhz AC123-01 信号,发射器未接收到控制器信息
- arduino - 尝试上传 WiFi 101 固件更新程序时出错
- arrays - 我有一个 mongodb JSON 数据,我想找到完全匹配的单词“已批准”