关于row_number、desek_rank、ntile等函数应用

前几天在处理一个上下班考勤问题,因为上下班都是在一个卡机里面打卡,也没有区分班别,制作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 一起区分排名。

扫描二维码关注公众号,回复: 10667339 查看本文章

分别用row_number和dense_rank 进行排名,效果如图,最后用dense_rank 的方式,下面看看效果:


最后再通过min、max和case when 结合使用取出上下班的刷卡时间(case when 部分省略),当然如果存在 07:00打卡、12:00打卡、17:00打卡、18:00打卡这样的数据,这种方法就没有办法取出准确的上下班数据,结果如图:



发布了22 篇原创文章 · 获赞 7 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qyx0714/article/details/72683408