您的位置:首页 > 其它

关于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打卡这样的数据,这种方法就没有办法取出准确的上下班数据,结果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐