好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQL 关于row_number()over()

SQL 关于row_number()over()

SQL 关于row_number()over()

SQL 关于row_number()over()

今天用到了row_number()over(),现在就以知识点的形式总结一下,以便于以后的回顾。

------------------- 参考资料MSDN -------------------

语法:

 ROW_NUMBER ( ) 
    OVER ( [  PARTITION BY  value_expression , ... [ n ] ]  order_by _clause ) 

通过语法可以看出 over里有两个参数,  partition by 和 order by ,其中 partition by 是可以不写的,但是 order by 是必须有的。可能对order by 比较熟悉(就是按什么排序),但  partition by 是什么意思呢? partition   的中文解释是: n. 划分,分开;[数] 分割;隔墙;隔离物 vt. [数] 分割;分隔;区分。 让我们再结合下面的参数说明和实例很容易就理解它的含义了。

参数:

PARTITION BY  value_expression          将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。   value_expression  指定对结果集进行分区所依据的列。      如果未指定 PARTITION BY,则此函数将查询结果集的 所有行视为单个组。 order_by_clause          ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
返回值类型:

bigint(长整型)

以上是对row_number()over()的理论了解,现在开始用例子演示:

先建表(dbo.PeopleInfo):

 CREATE   TABLE   [  dbo  ] . [  PeopleInfo  ]  (
      [  id  ]   [  int  ]   IDENTITY ( 1 , 1 )  NOT   NULL  ,
      [  name  ]   [  nchar  ] ( 10 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
      [  Gender  ]   [  nchar  ] ( 10 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
      [  numb  ]   [  nchar  ] ( 10 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
      [  phone  ]   [  nchar  ] ( 10 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
      [  FenShu  ]   [  int  ]   NULL  
)   ON   [  PRIMARY  ] 

向表中插入数据:

 insert   into  peopleinfo( [  name  ] ,Gender,numb,phone,fenshu)  values  ( '  李欢  ' , '  男  ' , '  3223  ' , '  1365255  ' , 80  )
  insert   into  peopleinfo( [  name  ] ,Gender,numb,phone,fenshu)  values  ( '  李欢  ' , '  男  ' , '  322123  ' , '  1  ' , 90  )
  insert   into  peopleinfo( [  name  ] ,Gender,numb,phone,fenshu)  values  ( '  李名  ' , '  男  ' , '  3213112352  ' , '  13152  ' , 56  )
  insert   into  peopleinfo( [  name  ] ,Gender,numb,phone,fenshu)  values  ( '  李名  ' , '  女  ' , '  32132312  ' , '  13342563  ' , 60  )
  insert   into  peopleinfo( [  name  ] ,Gender,numb,phone,fenshu)  values  ( '  王华  ' , '  女  ' , '  3223  ' , '  1365255  ' , 80 )

查询出所有插入的数据:

 select   *   from   dbo.PeopleInfo

结果如图:



例子 一 :只用order by 不用 partition by 的sql语句如下:

 --  不用partition by 
 select   [  name  ] ,gender,fenshu, row_number()  over ( order   by  fenshu  desc )  as  num  from  dbo.PeopleInfo

结果如图:

例子 二 :用order by 也用 partition by 的sql语句如下:

 select   [  name  ] ,gender,fenshu, row_number()  over (partition  by  Gender  order   by  fenshu  desc )  as  num  from  dbo.PeopleInfo

结果如图:

比较例子一和例子二的结果图很容易就明白 partition by 的用处了,以 例子 二为例就是先用partition by把性别【Gender】分成两个区一个男一个女,然后再用order by 把每个区里的分数【fenshu】从大到小排序。

-----------------------------------------------

练习题(用到了前面所讲的 cte(with。。。as)知识点 可以看看):

 --  查找出不同性别中分数最高的学生 
 with   temp   as  
(
  select   [  name  ] ,gender,fenshu, row_number()  over (partition  by  Gender  order   by  fenshu  desc )  as  num  from   dbo.PeopleInfo
)
  select   *   from   temp   where  num  =   1 

结果如图:

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于SQL 关于row_number()over()的详细内容...

  阅读:45次