使用SQL Server的RANK()函数时是否需额外添加ORDER BY语句?
关于SQL Server中RANK()函数与结果集排序的问题
结论
必须在RANK()函数之外额外添加外层的ORDER BY语句,才能保证最终结果集中的brand_id和list_price列保持有序。
原因
窗口函数(如RANK())的OVER子句里的ORDER BY,仅用于为窗口函数的计算定义排序规则(比如确定排名的依据),它不保证整个查询结果集的输出顺序。根据SQL标准,任何未显式指定ORDER BY的查询,返回结果的顺序是不确定的——数据库会根据执行计划优化(比如利用索引、并行处理等逻辑)返回数据,最终顺序可能和窗口函数内的排序逻辑完全不一致。
修改后的示例代码
SELECT * FROM ( SELECT product_id, product_name, brand_id, list_price, RANK () OVER ( PARTITION BY brand_id ORDER BY list_price DESC ) price_rank FROM production.products ) t WHERE price_rank <= 3 ORDER BY brand_id, list_price DESC; -- 显式指定全局排序规则
内容的提问来源于stack exchange,提问作者ddd
相关产品推荐
相关产品推荐

