代码:
--第一步,建立测试用表
create table sys.test_lcy(
name varchar2(4),
value integer
);
--第二步,检查表是否建立成功
select * from sys.test_lcy;
--第三步,插入试验数据
insert into sys.test_lcy values ('我',21);
insert into sys.test_lcy values ('我',22);
insert into sys.test_lcy values ('我',12);
insert into sys.test_lcy values ('你',33);
insert into sys.test_lcy values ('你',34);
insert into sys.test_lcy values ('你',10);
insert into sys.test_lcy values ('他',20);
insert into sys.test_lcy values ('他',34);
insert into sys.test_lcy values ('他',28);
--第四步,查询语句
SELECT NAME, VALUE
FROM (SELECT NAME,
VALUE,
ROW_NUMBER() OVER(partition by name order by value desc) AS RN
FROM sys.test_lcy)
WHERE RN <= 2;
附注: 1. sysplay的回答和我这个的区别是,如果 ('你',34) 这个值插入三次,那么他的语句出来的结果会出来三条,而我的结果仍然只有两条,如上图所示。 他的结果则变成如下图所示:
2.两个语句应用在不同场合,他的是用来做排名的,我的仅用来排序的。不存在谁对谁错的问题,请根据实际情况采用。
Select
A,B
From
(
Select
A,B,rank() Over(PARTITION BY A Order By B Desc) RankId
From
Mytable
) Mytable2
Where
RankId<=2