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

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

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

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


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

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

猜你喜欢

转载自takeme.iteye.com/blog/2302473