#第一版 select emp_no, salary, dense_rank() over(order by salary desc) as t_rank from salaries # select # emp_no, # salary, # dense_rank() over(order by salary desc) as rank # from # salaries # order by rank,emp_no;
为什么第一次我在dense里面加了emp_no asc结果是1234,最后去掉了emp_no asc,结果就是1223
经过查询他的排序逻辑,
DENSE_RANK()
窗口函数在 SQL 中用于为结果集中的行分配排名,其中排名是按照指定的排序逻辑计算的。当你在 DENSE_RANK()
函数中指定多个字段进行排序时,排序逻辑遵循以下规则:
- 第一个字段:首先按照第一个字段的排序条件对所有行进行排序。如果这个字段的值相同,则进入下一个字段的排序。
- 后续字段:如果第一个字段的值相同,则按照第二个字段的排序条件对这些行进行排序。如果第二个字段的值也相同,则继续按照下一个字段的排序条件进行排序,依此类推。
- 所有字段排序完毕:如果所有指定的字段值都相同,则这些行将获得相同的排名。
- 排名的连续性:与 RANK() 函数不同,DENSE_RANK() 函数在遇到相同的排名值时不会跳过任何排名。这意味着,如果有两个行的排名是 1,下一个排名将是 2,而不是 3。
所以我一开始那样写, 他就会先根据薪水排,如果薪水相同,再根据员工序列号排序,而这里的员工序列号是不同的,所以最终结果也一定会不同。
如果我第一版代码要成立,这些薪水相同的员工, 序列号也必须相同。
然后 我又问了,如果我只按照薪水排名,但是没有指定第二个字段,他会怎么排序?
回复是:如果你只根据薪水(salary
)排序,并且使用 DENSE_RANK()
窗口函数,那么在薪水相同的情况下,它会按照查询结果中行的物理顺序进行排序。因此,如果薪水相同,它将简单地按照查询结果中行的顺序来分配排名。这意味着,如果查询结果的顺序是由数据库的内部处理决定的,那么相同薪水的员工的排名可能会根据数据库如何处理这些行而有所不同。通常,这种顺序是不确定的,除非你明确指定了额外的排序规则。