有没有办法在“分组依据”国家/地区之后仅显示查询的前 2/n 个? - 大查询 SQL

问题描述

我正在对 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

如果应用于您问题中的样本数据 - 输出为

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...