您的位置:首页 > 数据库

关于SQL的partition by 字段的一些用法心得

2010-10-28 10:47 489 查看
先看列子:

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(PARTITON 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中相同项合并了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: