暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL SERVER函数row_number的应用示例

零壹旅途 2021-06-22
2057

微软从SQL SERVER 2005开始提供了一个函数:row_number(),用来生成行号。

它可以按指定字段进行排序,为查询结果集生成行号,还可以指定分组字段,对查询结果集进行分组后为每组从1开始生成行号。


它的语法:

1、不分组的方式:ROW_NUMBER() OVER (ORDER BY [排序字段名] DESC) 

2、按指定字段分组的方式:ROW_NUMBER  () OVER (PARTITION BY [分组字段名] ORDER BY [排序字段名] )


不分组方式的使用相对简单,我们也简单地举个例子。


首先,创建一个表:

create table TestTable(Name varchar(20),Duty varchar(10),InDate datetime,Remark varchar(200))


然后从药博士软件的员工表中导入一些数据:

insert into TestTable

select Name,Duty,CreatTime,Remark

from Employees 

where Duty<>''


再通过一条查询语句来展示row_number()函数的用法:

select ROW_NUMBER() OVER (ORDER BY [InDate] DESC) as RecID,* from TestTable


效果见下图:


分组的方式稍微复杂一些。下面,通过药博士医药软件中一个具体的需求来展示此函数的实际应用。


需求:根据商品类别编号重新生成商品编号。

规则:类别编号+序号。

类别编号定长4位,不足4位的在右边补0,序号定长4位,不足4位的在左边补0。


实现代码:

按规则生成新商品编号,并将商品资料导入到一个临时表:tempGoods


select left(K.KindNo+'0000', 4)

   + REPLACE(str(row_number() over (partition by left(K.KindNo+'0000', 4) order by left(K.KindNo+'0000', 4) asc), 4),' ', '0') as NewGoodsID

  ,G.*

into tempGoods

from Goodses G 

  join MainKinds K on G.MainKind = K.KindID and G.MainKind>0

order by K.KindNo


生成的数据截图:

文章转载自零壹旅途,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论