SQL2005后的ROW_NUMBER()函数的应用

系统 1528 0

SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单

分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生。这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到。SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单。下面是一个简单示例:

      
        --
      
      
        1.创建测试表 
      
      
        create
      
      
        table
      
      
         #score 

( 

name 
      
      
        varchar
      
      (
      
        20
      
      
        ), 

subject 
      
      
        varchar
      
      (
      
        20
      
      
        ), 

score 
      
      
        int
      
      
         

) 


      
      
        --
      
      
        2.插入测试数据 
      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        张三
      
      
        '
      
      ,
      
        '
      
      
        语文
      
      
        '
      
      ,
      
        98
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        张三
      
      
        '
      
      ,
      
        '
      
      
        数学
      
      
        '
      
      ,
      
        80
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        张三
      
      
        '
      
      ,
      
        '
      
      
        英语
      
      
        '
      
      ,
      
        90
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        语文
      
      
        '
      
      ,
      
        88
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        数学
      
      
        '
      
      ,
      
        86
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        英语
      
      
        '
      
      ,
      
        88
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李明
      
      
        '
      
      ,
      
        '
      
      
        语文
      
      
        '
      
      ,
      
        60
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李明
      
      
        '
      
      ,
      
        '
      
      
        数学
      
      
        '
      
      ,
      
        86
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        李明
      
      
        '
      
      ,
      
        '
      
      
        英语
      
      
        '
      
      ,
      
        88
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        林风
      
      
        '
      
      ,
      
        '
      
      
        语文
      
      
        '
      
      ,
      
        74
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        林风
      
      
        '
      
      ,
      
        '
      
      
        数学
      
      
        '
      
      ,
      
        99
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        林风
      
      
        '
      
      ,
      
        '
      
      
        英语
      
      
        '
      
      ,
      
        59
      
      
        ) 


      
      
        insert
      
      
        into
      
       #score(name,subject,score) 
      
        values
      
      (
      
        '
      
      
        严明
      
      
        '
      
      ,
      
        '
      
      
        英语
      
      
        '
      
      ,
      
        96
      
      
        ) 


      
      
        --
      
      
        3.取每个学科的前3名数据 
      
      
        select
      
      
        *
      
      
        from
      
      
         

( 


      
      
        select
      
       subject,name,score,ROW_NUMBER() 
      
        over
      
      (PARTITION 
      
        by
      
       subject 
      
        order
      
      
        by
      
       score 
      
        desc
      
      ) 
      
        as
      
       num 
      
        from
      
      
         #score 

) T 
      
      
        where
      
       T.num 
      
        <=
      
      
        3
      
      
        order
      
      
        by
      
      
         subject 


      
      
        --
      
      
        4.删除临时表 
      
      
        truncate
      
      
        table
      
      
         #score 


      
      
        drop
      
      
        table
      
       #score 
    

语法形式:ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)
解释:根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

转自:

http://www.jb51.net/article/29162.htm

参考:

http://msdn.microsoft.com/zh-cn/library/ms186734.aspx

http://www.cnblogs.com/85538649/archive/2011/08/13/2137277.html

 

SQL2005后的ROW_NUMBER()函数的应用


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论