SQL Server多重排序疑问:二次排序是否影响初次排序结果?
关于ROW_NUMBER()窗口函数多列排序的疑问
查询语句
Query 1
SELECT ROW_NUMBER() OVER(PARTITION BY C_CallID ORDER BY DATETIME) ROWNUMBER ,CallID ,C_CALLID ,NAME ,DATETIME FROM TABLENAME ORDER BY DATETIME
Query 2
SELECT ROW_NUMBER() OVER(PARTITION BY C_CallID ORDER BY DATETIME, NAME DESC) ROWNUMBER ,CallID ,C_CALLID ,NAME ,DATETIME FROM TABLENAME ORDER BY DATETIME ASC, NAME DESC
查询输出
Query 1 输出

Query 2 输出

疑问
我当前的理解是:ROW_NUMBER会先按DATETIME升序对所有记录排序,再对NAME列进行降序排序。现咨询:二次排序是否会对初次排序的结果产生任何影响?
解答
首先纠正你的理解偏差:ROW_NUMBER()窗口函数里的ORDER BY DATETIME, NAME DESC不是“先对所有记录按DATETIME升序,再整体对NAME降序”,而是在同一个C_CallID分区内,先按DATETIME升序排序;对于DATETIME值完全相同的记录,再按NAME降序排序。
针对你的问题:二次排序(NAME DESC)只会影响初次排序(DATETIME)后,那些DATETIME值相同的记录的顺序,进而改变这些记录的ROW_NUMBER编号。
从两张输出图的对比就能直观看到差异:在同一个C_CallID分组中,如果存在多条DATETIME相同的记录,Query1里这类记录的ROW_NUMBER是按数据库默认的无序规则分配(比如插入顺序);而Query2里会把NAME字典序更大的记录排在前面,对应更小的ROW_NUMBER。但对于DATETIME不同的记录,二次排序不会改变它们的相对顺序和ROW_NUMBER编号。
另外需要注意:查询末尾的ORDER BY是控制最终结果集的展示顺序,和ROW_NUMBER()窗口函数内部的排序逻辑是相互独立的,不要混淆两者的作用。
内容的提问来源于stack exchange,提问作者Sathiya Kumar V M
相关产品推荐
相关产品推荐

