select id, number, dense_rank() over(order by number desc) as t_rank from passing_number order by t_rank,id
下面是逐行解释:
- select *: 这部分指定了查询要返回passing_number表中的所有列。
- dense_rank() over(order by number desc) as t_rank: 这是一个窗口函数,DENSE_RANK()用于为每个不同的number值分配一个排名。over(order by number desc)指定了排名的计算方式,即按照number列的值降序排列。如果有多个行具有相同的number值,它们将获得相同的排名,但下一个不同值的排名不会跳过任何数字(这就是DENSE_RANK和RANK的区别,RANK会跳过)。as t_rank将这个排名的结果列命名为t_rank。
- from passing_number: 指定了查询的数据来源,即passing_number这个表。
- order by t_rank, id: 这是查询结果的最终排序指令。首先按照t_rank(即DENSE_RANK()函数的结果)升序排序,如果t_rank相同,则按照id列的值进行排序。这意味着首先会将具有最高number值的行排在最前面,然后是次高的,以此类推。如果有多行具有相同的number值,它们将根据id的值进行排序。
综上所述,这个查询语句的作用是:从passing_number
表中选择所有数据,为每个不同的number
值分配一个排名,然后按照这个排名和id
的值对结果进行排序。这样,你可以很容易地看到哪些行有最高的number
值,以及它们在表中的顺序。
这里窗口函数,是先把number进行降序排列,然后放在那里,number就已经是降序排好了,然后单独开一个窗口用来排名t_rank,用dense_rank,最后是将t_rank,id进行升序排列,先按照t_rank,如果t_rank相同,再看id