SqlServer rank,row_number,dense_rank,ntile

最近学习了sql server的四个窗口函数,特此记录下。

over语句的优点是,能够再返回基本列的同时,能在同一行对他们聚合。

平时row_number用的比较多,结合partiton 和order by使用,在外层再嵌套一个select ,where rownumber=1可以做到按照时间倒序排列只取最新值的效果。

在这里插入图片描述

row_number给每个数据一个行号,不会出现并列行号的情况。

在这里插入图片描述

这样就能达到我前面说的去重的效果。partition by里可以写多个列,用法类似group by。但是group by每组只会返回一行数据,而partition by会和基本列一起返回。

在这里插入图片描述
在这里插入图片描述
rank() over(order by sales) 如果有2个并列第一,序号都会显示为一,但是下一个的序号会从三开始。
dense_rank() over(order by sales)如果有两个并列第一,序号会显示为一,下一个的序号从二开始。序号是连贯的。
rank表示之前有多少行数据,dense_rank表示之前有多少个数据(包括重复,重复的算一个数据)
rank列的9 表示前面有8行数据,dense_rank的9表示前面有8个数据(包括重复)
rank() 表示第n行之前有n-1行数据。desse_rank()表示第n行之前有n-1种数据

Ntile函数把行分类,Ntile(10)表示把所有数据分为10组,但如果不能整除,余数将放到开头的每个组。 假设有102行,分为5组,那么就是前两组是21行。