使用FIRST_VALUE()时如何获取各区域最高销量对应的商品记录
解决方案
方法1:使用ROW_NUMBER()窗口函数(最推荐,逻辑直观易维护)
这是实现该需求最常用的方案,直接给每个区域内的行按销量倒序排序后取第一位,就能拿到完整的行信息:
SELECT region, item, units_sold FROM ( SELECT region, item, units_sold, ROW_NUMBER() OVER (PARTITION BY region ORDER BY units_sold DESC) AS rn FROM region_view ) t WHERE rn = 1 ORDER BY region;
如果业务场景中存在同一个区域多个商品销量并列最高、需要全部返回的情况,把ROW_NUMBER()替换为RANK()即可。
方法2:基于原有FIRST_VALUE写法调整
你之前的写法只提取了最高销量值,只要同时对item字段也取窗口的第一个值,再去重也能得到预期结果:
SELECT DISTINCT region, FIRST_VALUE(item) OVER ( PARTITION BY region ORDER BY units_sold DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS item, FIRST_VALUE(units_sold) OVER ( PARTITION BY region ORDER BY units_sold DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS best_selling FROM region_view ORDER BY region;
这种写法需要重复写两次窗口逻辑,相比方法1可读性和维护性都更低,更推荐使用第一种方案。
内容的提问来源于stack exchange,提问作者Joy H
相关产品推荐
相关产品推荐

