分享好友 最新资讯首页 最新资讯分类 切换频道
SQL Server2005 四个排名函数(row
2024-12-28 16:39

其中field1字段的类型是intfield2字段的类型是varchar

一、row_number

    row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。row_number函数的用法如下面的SQL语句所示:

 

select row_number() over(order by field1) as row_number,* from t_table

    实际上,row_number函数生成序号的基本原理是先使用over子句中的排序语句对记录进行排序,然后按着这个顺序生成序号。over子句中的order by子句与SQL语句中的order by子句没有任何关系,这两处的order by 可以完全不同,如下面的SQL语句所示:

 

select row_number() over(order by field2 descas row_number,* from t_table order by field1 desc

with t_rowtable
as
(
    
select row_number() over(order by field1) as row_number,* from t_table
)
select * from t_rowtable where row_number>1 and row_number < 4 order by field1

select * from (select top 2 * fromselect top 3 * from t_table order by field1) a order by field1 desc) b order by field1

    这个查询结果除了没有序号列row_number,其他的与图4所示的查询结果完全一样。

二、rank

select rank() over(order by field1),* from t_table order by field1

三、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函数可以对序号进行分组处理。这就相当于将查询出来的记录集放到指定长度的数组中,每一个数组元素存放一定数量的记录。ntile函数为每条记 录生成的序号就是这条记录所有的数组元素的索引(从1开始)。也可以将每一个分配记录的数组元素称为“桶”。ntile函数有一个参数,用来指定桶数。下 面的SQL语句使用ntile函数对t_table表进行了装桶处理:

select ntile(4over(order by field1) as bucket,* from t_table

    由于t_table表的记录总数是6,而上面的SQL语句中的ntile函数指定了桶数为4

    也许有的读者会问这么一个问题,SQL Server2005怎么来决定某一桶应该放多少记录呢?可能t_table表中的记录数有些少,那么我们假设t_table表中有59条记录,而桶数是5,那么每一桶应放多少记录呢?

    实际上通过两个约定就可以产生一个算法来决定哪一个桶应放多少记录,这两个约定如下:

1. 编号小的桶放的记录不能小于编号大的桶。也就是说,第1捅中的记录数只能大于等于第2桶及以后的各桶中的记录。

2. 所有桶中的记录要么都相同,要么从某一个记录较少的桶开始后面所有捅的记录数都与该桶的记录数相同。也就是说,如果有个桶,前三桶的记录数都是10,而第4捅的记录数是6,那么第5桶和第6桶的记录数也必须是6

    根据上面的两个约定,可以得出如下的算法:

    // mod表示取余,div表示取整 
    if(记录总数 mod 桶数 == 0)
    {
        recordCount 
= 记录总数 div 桶数;
        将每桶的记录数都设为recordCount
    } 
    
else
    {
        recordCount1 
= 记录总数 div 桶数 + 1;
        
int n = 1;  //  n表示桶中记录数为recordCount1的最大桶数
        m = recordCount1 * n;
        
while(((记录总数 - m)  mod  (桶数 -  n))  != 0 )
        {
            n
++;
            m 
= recordCount1 * n;
        } 
        recordCount2 
= (记录总数 - m) div  (桶数 - n);
        将前n个桶的记录数设为recordCount1
        将n 
+ 1个至后面所有桶的记录数设为recordCount2
    }

    根据上面的算法,如果记录总数为59,桶数为5,则前4个桶的记录数都是12,最后一个桶的记录数是11

    如果记录总数为53,桶数为5,则前3个桶的记录数为11,后2个桶的记录数为10

最新文章
天翼云ip防封效果
天翼云DDoS高防IP指向域名是一种网络安全服务,它能够帮助用户抵御大规模的网络攻击,保护网站和业务的正常运营,这种服务主要通
神马股份:神马股份关于公司全资子公司平煤神马融资租赁有限公司开展融资租赁业务暨关联交易的公告
截至2023年9月30日,河南首成科技新材料有限公司资产总额为157,321.88万元,总负债为121,688.22万元,净资产为35,633.66万元;实
商务车10大品牌排行榜【最新名单公布】
1、大型多功能休旅车(Large MPV)-车长超过4,600mm,乘坐人数多在七人以上,座椅配置采用三排。有些大型MPV会被认为是Van箱型车
[学习资料]元旦晚会策划案模板[推广有奖]
元旦晚会策划案模板(实用版)编制人:__________________审核人:__________________审批人:__________________编制单位:____
短剧小程序开发案例分享
案例介绍:小剧场短剧小程序是一种基于微信小程序平台开发的应用程序,主要用于展示和播放短剧内容。这种小程序通过视频、音频等
额满即止!AI短视频电商技能培训开始报名啦~
为大力推行“妈妈岗”灵活就业新模式,提升妇女群众电商从业技能,在市妇联指导下,石岐街道妇联链接巾帼创业导师资源,将于12月
生肖已解“能说会道舌如簧二四可见本期中”是什么生肖?最新热门解答落实_win305.210
十二生肖华夏传承各领风骚神秘又独特。字谜诗句如下:蛇藏智慧深且长马奔人际善交际。猴舞人间巧舌如簧鸡鸣四方传信息。生肖之中
网站收录暴涨!自动收录工具帮您实现 | 数字百宝箱011期
面对搜索引擎收录规则,怎么做? 搜索引擎收录涉及到评估网页内容的原创性、独特性和深度,使用网络爬虫定期抓取并分析网页,提取
新闻多一度丨张文宏投诉“张文宏” AI仿冒名人边界在何处?
​​12月15日,“微信珊瑚安全”发布公告称,近期有媒体报道网络存在利用AI技术仿冒名人进行不当营销的现象。结合用户举报、日常
【供应】小程序商城开发需要多少钱_制作小程序需要多少钱_山东光环云计算有限公司
  杀、推广、会员卡、积分、优惠券等,帮助店铺实现裂变、新转型!发布上线很多朋友想要了解微信小程序开发详细步骤,本文就为