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 继续排名
排名开窗函数可以单独使用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