在实际工作中,需要查询出数据的序号或者对数据进行排序,针对这个问题,可以使用:
rank() over() 和 row_number() over()函数
rank---本意为排序,按照数据的大小排序,添加序号,如果有两个数据(数值)相同,那么,这个序号就是一样的。比如:班级两个并列第一,那么,这两个序号都是 1;
row_number ----row在编程中是行的意思,这个可以理解为返回行号,只要行增加,这个函数的序号就会增加。比如:班级两个并列第一,那么,这两个序号会是1和2。
使用案例:
数据表:
1、row_number添加序号:
2、rank()添加序号:
3、dense_rank()排序
rank()如果有相同数值,中间会有缺失,比如上图的1到3之间,就少了2;而实际中,可能两个并列第一,接下来是第二名,而非第三名,因此可以使用dense_rank(),效果如下图:
拓展:
对组内数据进行排序,可以用:partition by
使用案例:
使用以上数据,对具有相同id的,在组内进行排序,如下:
补充:
1、在实际工作中,可能因为数据库的版本不同,使用row_number(),而无法跑出数据,因此,可以使用@i,办法,具体语句如下:SELECT里的 @i(下图第一个出现的),表示步长是 1(根据需要可更改);而from后面的 @i,表示初始值为 0(根据可以更改)
2、空值正常定义是比有值小,在实际应用场景,有时需要从小到大排序,而空值需要排到最后,因此,需要做特别处理:
第一种:需要排序的是日期或者数字,在order by 后面加一个负号,再加DESC排序;
第二种:需要排序的是字母,则可以用 IS NULL或者 isnull函数,这个对汉字不太起作用