在数据集中可用的每一年中找到每个国家/地区的前 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;
我加入了 2 tables 并在 Tim Biegeleisen这个
原始订单 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;