关于row_number、desek_rank、ntile等函数应用
2017-05-24 18:48
295 查看
前几天在处理一个上下班考勤问题,因为上下班都是在一个卡机里面打卡,也没有区分班别,制作SSRS 报表时数据比较乱,后来想起用SQL 的desek_rank 函数来区分上下班,SQL 有几个排名函数,下面来说说常用的这几个吧,
一:row_number
row_number:函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:select
row_number() over(order by field1) as row_number,* from t_table
二:dense_rank:
dense_rank函数的功能与rank函数类似,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续。如上面的例子中如果使用dense_rank函数,第4条记录的序号应该是2,而不是4。如下面的SQL语句所示:
select dense_rank() over(order by field1),* from t_table order by field1
三:ntile
NTILE()函数把记录结果集分成N部分,与over 使用,如:select *, ntile(5) over(order by id) from a 把ID列分5部分
说说我的刷卡原始记录:
按白班的上班基准,下面对人员及刷卡时间进行排名,最后取出最小和最大的打卡数据,因为同一时间有重复刷卡,所以需要利用partition by 一起区分排名。
分别用row_number和dense_rank 进行排名,效果如图,最后用dense_rank
的方式,下面看看效果:
最后再通过min、max和case when 结合使用取出上下班的刷卡时间(case when 部分省略),当然如果存在 07:00打卡、12:00打卡、17:00打卡、18:00打卡这样的数据,这种方法就没有办法取出准确的上下班数据,结果如图:
一:row_number
row_number:函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:select
row_number() over(order by field1) as row_number,* from t_table
二:dense_rank:
dense_rank函数的功能与rank函数类似,只是在生成序号时是连续的,而rank函数生成的序号有可能不连续。如上面的例子中如果使用dense_rank函数,第4条记录的序号应该是2,而不是4。如下面的SQL语句所示:
select dense_rank() over(order by field1),* from t_table order by field1
三:ntile
NTILE()函数把记录结果集分成N部分,与over 使用,如:select *, ntile(5) over(order by id) from a 把ID列分5部分
说说我的刷卡原始记录:
按白班的上班基准,下面对人员及刷卡时间进行排名,最后取出最小和最大的打卡数据,因为同一时间有重复刷卡,所以需要利用partition by 一起区分排名。
分别用row_number和dense_rank 进行排名,效果如图,最后用dense_rank
的方式,下面看看效果:
最后再通过min、max和case when 结合使用取出上下班的刷卡时间(case when 部分省略),当然如果存在 07:00打卡、12:00打卡、17:00打卡、18:00打卡这样的数据,这种方法就没有办法取出准确的上下班数据,结果如图:
相关文章推荐
- SQL Server2008 排序函数应用RowNumber ,Rank,Dense_Rank ,Ntile
- SQL server 2005新增的几个函数,分别是row_number( )、rank( )、,DENSE_RANK( )、ntile( )
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- 排名函数 RANK,NTILE,DENSE_RANK,ROW_NUMBER
- SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法
- SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较
- (转)SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL2005中row_number( )、rank( )、dense_rank( )、ntile( )函数的用法(2)
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()
- SQL Server 2005四个新的排序函数: ROW_NUMBER、RANK、DENSE_RANK 和 NTILE
- SQLServer 2005 实现排序报表的利器 排序函数RANK()、DENSE_RANK()、NTILE()和ROW_NUMBER()