您的位置:首页 > 数据库

sql ROW_NUMBER() 排序函数

2016-03-21 10:50 387 查看
关于SQL的partition by 字段的一些用法心得-可实现自动分配组号跟归组合并
2011-03-06 13:10
关于SQL的partition by 字段的一些用法心得

先看例子:

if object_id('TESTDB') is not null drop table TESTDB

create table TESTDB(A varchar(8), B varchar(8))

insert into TESTDB

select 'A1', 'B1' union all

select 'A1', 'B2' union all

select 'A1', 'B3' union all

select 'A2', 'B4' union all

select 'A2', 'B5' union all

select 'A2', 'B6' union all

select 'A3', 'B7' union all

select 'A3', 'B3' union all

select 'A3', 'B4'

-- 所有的信息

SELECT * FROM TESTDB

 

A    B

-------

A1  B1

A1  B2

A1  B3

A2  B4

A2  B5

A2  B6

A3  B7

A3  B3

A3  B4

-- 使用PARTITION BY 函数后

SELECT *,ROW_NUMBER() OVER(PARTITION BY A ORDER BY A DESC) NUM
FROM TESTDB

A  
B   NUM

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

A1  B1  1

A1  B2  2

A1  B3  3

A2  B4  1

A2  B5  2

A2  B6  3

A3  B7  1

A3  B3  2

A3  B4  3

 

可以看到结果中多出一列NUM 这个NUM就是说明了相同行的个数,比如A1有3个,他就给每个A1标上是第几个。

-- 仅仅使用ROW_NUMBER() OVER的结果

SELECT *,ROW_NUMBER() OVER(ORDER BY A DESC)NUM FROM TESTDB

 A  
B    
NUM

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

A3  B7   1

A3  B3  
2

A3  B4  
3

A2  B4  
4

A2  B5  
5

A2  B6  
6

A1  B1  
7

A1  B2  
8

A1  B3  
9

可以看到它只是单纯标出了行号。

-- 深入一点应用

SELECT A = CASE WHEN NUM = 1 THEN A ELSE '' END,B

FROM (SELECT A,NUM = ROW_NUMBER() OVER(PARTITION BY A ORDER BY A
DESC) FROM TESTDB) T

A    B

---------

A1  B1

    B2

    B3

A2  B4

    B5

    B6

A3  B7

    B3

    B4

 

可以看出结果按照A中相同项合并了。效果可以结合这个来做。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: