如何修改SQL查询实现每年仅返回1条年度销量最高手机记录
每年返回销量最高手机机型的SQL实现方案
你可以通过窗口函数对数据按年份分区排序,再筛选每个分区排名第一的记录即可实现需求,不需要改动你原有查询的核心筛选逻辑。
可直接运行的修改后代码
SELECT manufacturer, model, year, units_sold_m FROM ( SELECT manufacturer, model, year, units_sold_m, ROW_NUMBER() OVER ( PARTITION BY year ORDER BY units_sold_m DESC ) AS sales_rank FROM `quick-catcher-350001.Phone_Sales.Phone` WHERE smartphone = TRUE ) WHERE sales_rank = 1 ORDER BY year DESC
逻辑说明
- 内层查询保留了你原有的筛选智能手机的条件,新增了窗口函数
ROW_NUMBER():以year为分区维度,同一年份内的机型按销量units_sold_m从高到低排序生成排名,当年销量最高的机型排名值为1 - 外层查询仅筛选排名为1的记录,即可保证每个年份仅返回1条销量最高的机型结果
- 最终按年份倒序排列,方便按时间从近到远查看结果
特殊场景处理
如果存在同一年两款机型销量完全相同的情况,基础写法会随机返回其中一条。如果需要保证结果稳定,可以在窗口函数的排序规则中增加次级排序字段,比如按机型名、厂商名排序:
ROW_NUMBER() OVER ( PARTITION BY year ORDER BY units_sold_m DESC, model, manufacturer ) AS sales_rank
如果需要把当年销量并列第一的机型全部返回,可以将ROW_NUMBER()替换为RANK(),但这种写法可能出现单年返回多条记录的情况,不符合每年仅返回1条的要求时不建议使用。
内容的提问来源于stack exchange,提问作者Jaryd Spevack
相关产品推荐
相关产品推荐

