首页 > 解决方案 > 有没有办法在“分组”国家之后只显示查询的前 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

标签: sqlfiltergoogle-bigqueryranking

解决方案


使用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;

推荐阅读