有没有办法只显示 "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

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