sql server 分组后,取每组前1条数据

sql 排名开窗函数 ROW_NUMBER、DENSE_RANK、RANK、NTILE属于排名函数。
排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。

PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

ODER BY 指定排名开窗函数的顺序。在排名开窗函数中必须使用ORDER BY语句


[url]http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html[/url]

rank 跳过排名 dense_rank 继续排名

create table tb_test(name varchar(10),val int,memo varchar(20))
insert into tb_test values('a', 2, 'a2(a的第二个值)')
insert into tb_test values('a', 1, 'a1--a的第一个值')
insert into tb_test values('a', 3, 'a3:a的第三个值')
insert into tb_test values('b', 1, 'b1--b的第一个值')
insert into tb_test values('b', 3, 'b3:b的第三个值')
insert into tb_test values('b', 2, 'b2b2b2b2')
insert into tb_test values('b', 4, 'b4b4')
insert into tb_test values('b', 5, 'b5b5b5b5b5')
insert into tb_test values('b', 5, 'bb5')
go

--方案1

select a.* from tb_test a where not exists(select 1 from tb_test where name = a.name and val > a.val) ;

select a.* from tb_test a,(select name,max(val) val from tb_test group by name) b where a.name = b.name and a.val = b.val order by a.name;

select a.* from tb_test a inner join (select name , max(val) val from tb_test group by name) b on a.name = b.name and a.val = b.val order by a.name


--方案2 分组后 取每组前 2条数据
select * from (
SELECT ROW_NUMBER()
over
(PARTITION By name order by val) as rowId,tb_test.*
FROM tb_test
) t
where rowid <= 2

你可能感兴趣的:(SQL,Server)