在数据集中可用的每一年中找到每个国家/地区的前 2 名供应商? - 大查询 SQL

Find the top 2 vendors per country, in each year available in the dataset? - bigquery SQL

我加入了 2 tables 并在 Tim Biegeleisen这个 ,现在我想更进一步,按国家/地区对前 2 名供应商进行分组。

原始订单 table 如下所示:

country_name date_local vendor_id gmv_local is_successful_order
台湾 2012-10-02 2870 559.6 正确
台湾 2012-10-02 3812 573.5 正确
新加坡 2012-10-02 941 778.6 正确
新加坡 2014-10-02 13 120.6 正确
曼谷 2014-10-02 227 563.6 正确

此 table 已与供应商合并 table

id vendor_name country_name
2870 C楼 台湾
941 一栋房子 新加坡
227 9号楼 曼谷

我想将“date_local”列中的年份提取为时间戳格式,其中年份列中的项目看起来像原始的“2012-01-01T00:00:00” “2012-10-02”的日期格式

然后我想列出每个国家按年度总收入排名前 2 位的供应商

结果 table 应如下所示:

country_name vendor_name total_gmv
2012-01-01T00:00:00 新加坡 一栋房子 1119.76
2012-01-01T00:00:00 新加坡 B楼 819.63
2012-01-01T00:00:00 台湾 C楼 119.6
2012-01-01T00:00:00 台湾 D楼 119.6
2012-01-01T00:00:00 曼谷 9号楼 119.6
2014-01-01T00:00:00 新加坡 一栋房子 2119.76
2014-01-01T00:00:00 新加坡 B楼 1819.63
2014-01-01T00:00:00 台湾 C楼 1019.6
2014-01-01T00:00:00 台湾 D楼 919.6
2014-01-01T00:00:00 曼谷 9号楼 189.6

printscreen of target results

我知道我需要再添加一个 Extract( year FROM date_local) as year 分区并将其设置为正确的 GETDATE() 时间戳格式以添加所需的额外层,但我不知道如何添加它到代码

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 `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 <= 1
ORDER BY country_name, total_gmv DESC;

如果我没理解错的话,你只需要也按年聚合,然后将年添加到调用ROW_NUMBER的分区:

SELECT
    Ord.country_name,
    vn.vendor_name,
    EXTRACT(year FROM date_local) AS year,
    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,
    EXTRACT(year FROM date_local)
QUALIFY ROW_NUMBER() OVER (PARTITION BY country_name, EXTRACT(year FROM date_local)
                           ORDER BY total_gmv DESC) <= 2
ORDER BY
    Ord.country_name DESC,
    total_gmv DESC;