sqlserver随笔

来源:互联网 发布:战国之怒进阶数据 编辑:程序博客网 时间:2024/06/03 13:33

----整个结果集是个分组,以b进行排名

select a , b, c , RANK() over(order by b) rank1 from TEST_OVER_01 ;

 

----整个结果集进行分组,以a进行排名

select a, b, c, RANK() over(order by a) rank2 from TEST_OVER_01 ;

 

----以a,b 进行分组,在每个小组内以b进行排名。

select a, b ,c ,RANK() over(partition by a,b order by b) rank3 from TEST_OVER_01;

 

--3.相关总结:

rank() over(partition by 列1,列2等 order by 列xx )

partition by -- 用于给结果集分组,如果没有指定,则是对整个结果集作为一个分组

rank() -- 用于在分组内部进行排序。需要注意的是,ran()是跳跃排序,即:如果有两个第1名,则接下来就是第3,忽略第2的情况。



--函数

select  FName, FSalary, FCity, FAge,  row_number() over(order by FSalary) as rownum,  rank() over(order by FSalary) as rank,  dense_rank() over(order by FSalary) as dense_rank,  ntile(6) over(order by FSalary)as ntile from  T_Person order by  FName  

最终结果是按照FName进行升序显示的。

对于row_number() over(order by FSalary) as rownum来说,这个排序开窗函数是按FSalary升序的方式来排序,并得出排序结果的序号

对于rank() over(order by FSalary) as rank来说,这个排序形容函数是按FSalary升序的方式来排序,并得出排序结果的排名号。这个函数求出来的排名结果可以排列,并列排名之后的排名将是并列的排名加上并列数(简单说每个人只有一种排名,然后出现两个并列第一名的情况,这时候排在两个第一名后面的人将是第三名,也就是没有了第二名,但是有两个第一名)

对于dense_rank() over(order by FSalary) as dense_rank来说,这个排序函数是按FSalary升序的方式来排序,并得出排序结果的排名号。这个函数与rand()函数不同在于,并列排名之后的排名只是并列排名加1(简单说每个人只有一种排名,然后出现两个并列第一名的情况,这时候排在两个第一名后面的人将是第二名,也就是两个第一名,一个第二名)

对于ntile(6) over(order by FSalary)as ntile 来说,这个排序函数是按FSalary升序的方式来排序,然后6等分成6个组吗,并显示所在组的序号。

排序函数和聚合开窗函数类似,也支持在OVER子句中使用PARTITION BY语句


select  FName, FSalary, FCity, FAge,  row_number() over(partition by FName  order by FSalary) as rownum,  rank() over(partition by FName order by FSalary) as rank,  dense_rank() over(partition by FName order by FSalary) as dense_rank,  ntile(6) over(partition by FName order by FSalary)as ntile from  T_Person order by  FName

关于PARTITION BY子句,请看上面的介绍,这里就不再累赘了。但是需要注意一点的是,在排序开窗函数中使用PARTITION BY子句需要放置在ORDER BY子句之前。

原创粉丝点击