有没有办法只显示 "group by" 个国家/地区之后的前 2/n 个查询? - 大查询 SQL
Is there a way to show only the top 2/nth of a query after "group by" country? - bigquery SQL
我正在对 Google 大查询进行查询,我加入了 2 table 并创建了一个新列“total gmv”,使用“SUM”表示总收入,现在我只想在查询中显示前 2 个供应商,按国家/地区分组。
我设法按国家/地区和 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
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 名供应商?
我的目标 table 应该是这样的,只显示前 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
使用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;
下面是方法 - 只需在您的代码中多加一行
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
如果应用于您问题中的示例数据 - 输出为
我正在对 Google 大查询进行查询,我加入了 2 table 并创建了一个新列“total gmv”,使用“SUM”表示总收入,现在我只想在查询中显示前 2 个供应商,按国家/地区分组。
我设法按国家/地区和 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
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 名供应商?
我的目标 table 应该是这样的,只显示前 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 |
使用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;
下面是方法 - 只需在您的代码中多加一行
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
如果应用于您问题中的示例数据 - 输出为