row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
--表示根据COL1分组,在分组内部根据 COL2排序,而此函数返回的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
create table student (id int ,classes int ,score int); insert into student values(1,1,89); insert into student values(2,1,90); insert into student values(3,1,76); insert into student values(4,2,69); insert into student values(5,2,79); insert into student values(6,2,95); insert into student values(7,3,80); insert into student values(8,3,85); insert into student values(9,3,79); commit;
select t.* from student t;
--数据显示为
id       classes      score
-------------------------------------------------------------
1           1          89
2           1          90
3           1          76
4           2          69
5           2          79
6           2          95
7           3          80
8           3          85
9           3          79
--需求:根据班级分组,显示每个班的英语成绩排名
--预期结果:
id       classes      score                              rank
----------- ----------- --------------------------------------- 
3           1          76                                 1
1           1          89                                 2
2           1          90                                 3
4           2          69                                 1
5           2          79                                 2
6           2          95                                 3
9           3          79                                 1
7           3          80                                 2
8           3          85                                 3
--SQL脚本:
SELECT *, Row_Number() OVER (partition by classes ORDER BY score desc) rank FROM student;
--查询t_test表中,callid字段没有重复过的数据,效率高过group by having count
select t.*, t.rowid
  from t_test t
 where t.rowid not in (select rid
                         from (select t2.rowid rid,
                                      row_number() over(partition by t2.callid order by t2.rowid desc) m
                                 from t_test t2)
                        where m <> 1)
   and t.rowid not in (select rid
                         from (select t2.rowid rid,
                                      row_number() over(partition by t2.callid order by t2.rowid asc) m
                                 from t_test t2)
                        where m <> 1);
 
row_number() OVER (PARTITION BY COL1 ORDER BY COL2),布布扣,bubuko.com
row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
原文地址:http://blog.csdn.net/helloboat/article/details/36634935