转自:http://blog.csdn.net/luojinbai/article/details/45078809

语法: 
 ROW_NUMBER() OVER( [ PRITITION BY col1] ORDER BY col2[ DESC ] )

解释: 
 ROW_NUMBER()为返回的记录定义个行编号, PRITITION BY col1 是根据col1分组,ORDER BY col2[ DESC ]是根据col2进行排序。

举例:

postgres=# create table student(id serial,name character varying,course character varying,score integer);
CREATE TABLE
postgres=#
postgres=# \d student
Table "public.student"
Column | Type | Modifiers
--------+-------------------+----------------------------------------------
id | integer | not null default nextval('student_id_seq'::regclass)
name | character varying |
course | character varying |
score | integer |
 insert into student (name,course,score) values('周润发','语文',89);

 insert into student (name,course,score) values('周润发','数学',99);

 insert into student (name,course,score) values('周润发','外语',67);

 insert into student (name,course,score) values('周润发','物理',77);

 insert into student (name,course,score) values('周润发','化学',87);

 insert into student (name,course,score) values('周星驰','语文',91);

 insert into student (name,course,score) values('周星驰','数学',81);

 insert into student (name,course,score) values('周星驰','外语',88);

 insert into student (name,course,score) values('周星驰','物理',68);

 insert into student (name,course,score) values('周星驰','化学',83);

 insert into student (name,course,score) values('黎明','语文',85);

 insert into student (name,course,score) values('黎明','数学',65);

 insert into student (name,course,score) values('黎明','外语',95);

 insert into student (name,course,score) values('黎明','物理',90);

 insert into student (name,course,score) values('黎明','化学',78);

1. 根据分数排序

postgres=# select *,row_number() over(order by score desc)rn from student;
id | name | course | score | rn
----+--------+--------+-------+----
2 | 周润发 | 数学 | 99 | 1
13 | 黎明 | 外语 | 95 | 2
6 | 周星驰 | 语文 | 91 | 3
14 | 黎明 | 物理 | 90 | 4
1 | 周润发 | 语文 | 89 | 5
8 | 周星驰 | 外语 | 88 | 6
5 | 周润发 | 化学 | 87 | 7
11 | 黎明 | 语文 | 85 | 8
10 | 周星驰 | 化学 | 83 | 9
7 | 周星驰 | 数学 | 81 | 10
15 | 黎明 | 化学 | 78 | 11
4 | 周润发 | 物理 | 77 | 12
9 | 周星驰 | 物理 | 68 | 13
3 | 周润发 | 外语 | 67 | 14
12 | 黎明 | 数学 | 65 | 15
(15 rows)

rn是给我们的一个排序。

2. 根据科目分组,按分数排序

postgres=# select *,row_number() over(partition by course order by score desc)rn from student;
id | name | course | score | rn
----+--------+--------+-------+----
5 | 周润发 | 化学 | 87 | 1
10 | 周星驰 | 化学 | 83 | 2
15 | 黎明 | 化学 | 78 | 3
13 | 黎明 | 外语 | 95 | 1
8 | 周星驰 | 外语 | 88 | 2
3 | 周润发 | 外语 | 67 | 3
2 | 周润发 | 数学 | 99 | 1
7 | 周星驰 | 数学 | 81 | 2
12 | 黎明 | 数学 | 65 | 3
14 | 黎明 | 物理 | 90 | 1
4 | 周润发 | 物理 | 77 | 2
9 | 周星驰 | 物理 | 68 | 3
6 | 周星驰 | 语文 | 91 | 1
1 | 周润发 | 语文 | 89 | 2
11 | 黎明 | 语文 | 85 | 3
(15 rows)

3. 获取每个科目的最高分

postgres=# select * from(select *,row_number() over(partition by course order by score desc)rn from student)t where rn=1;
id | name | course | score | rn
----+--------+--------+-------+----
5 | 周润发 | 化学 | 87 | 1
13 | 黎明 | 外语 | 95 | 1
2 | 周润发 | 数学 | 99 | 1
14 | 黎明 | 物理 | 90 | 1
6 | 周星驰 | 语文 | 91 | 1
(5 rows)

4. 每个科目的最低分也是一样的

postgres=# select * from(select *,row_number() over(partition by course order by score)rn from student)t where rn=1;
id | name | course | score | rn
----+--------+--------+-------+----
15 | 黎明 | 化学 | 78 | 1
3 | 周润发 | 外语 | 67 | 1
12 | 黎明 | 数学 | 65 | 1
9 | 周星驰 | 物理 | 68 | 1
11 | 黎明 | 语文 | 85 | 1
(5 rows)

只要在根据科目排序的时候按低到高顺序排列就好了。

PostgreSQL ROW_NUMBER() OVER()的更多相关文章

  1. postgresql中rank() over, dense_rank(), row_number() 的用法和区别

  2. SQL关于分页的sql查询语句 limit 和row_number() OVER函数

    在做项目的时候需要些分页,用的数据库是mysql,之前看到的参考例子是用MS SQL做的,在MS SQL.ORACLE里面有ROW_NUMBER() OVER函数可以在数据库里对数据进行分组.百度后的 ...

  3. postgresql之distinct用法

    1. 去重:关键字distinct去重功能  在其他数据库(oracle,mysql)是存在:当然postgresql也有这个功能 [postgres@sdserver40_210 ~]$ psql ...

  4. CYQ.Data 支持 PostgreSQL 数据库

    前言: 很久之前,就有同学问我CYQ.Data能不能支持下PostgreSQL,之后小做了下调查,发现这个数据库用的人少,加上各种因素,就一直没动手. 前两天,不小心看了一下Github上的消息: 看 ...

  5. PostgreSQL>窗口函数的用法

    PostgreSQL之窗口函数的用法 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html PostgreSQL的高级特性本准备三篇的(递归. ...

  6. postgresql语句

    查询oracle数据库所有表数据量 select t.table_name,t.num_rows from user_tables t ORDER BY t.num_rows desc 查询postg ...

  7. SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()

    >>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...

  8. postgresql 常用速查

    中文资料 中文资料 /**gp中的基本sql语法**/ --删除表 drop table testtb; --创建表 CREATE TABLE testtb ( id integer, "n ...

  9. mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数

    在做项目的时候需要些分页,用的数据库是MySQL,之前看到的参考例子是用MS SQL做的,在MS SQL.Oracle里面有ROW_NUMBER() OVER函数可以在数据库里对数据进行分组.百度后的 ...

随机推荐

  1. winform TreeView的一些用法以及异步加载

    今天,主要弄了一下对于树型控件的一些方法,以及异步加载.参考: http://www.cnblogs.com/greatverve/archive/2012/03/23/winform-treevie ...

  2. Windows 10 使用C#如何将IE设置为默认浏览器

    在WPF XBAP项目中遇到这样一个问题,程序在Windows 10上面无法运行.原因是因为Windows 10默认浏览器是Edge,而XBAP程序是需要在IE上面运行的.于是开始想办法修改Windo ...

  3. MySQL批量删除指定前缀表

    Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_name LIKE ...

  4. Oracle两列字段替换和复制

  5. jquery简单开始

    老师讲好少,我也没办法. &(function(){ 执行完所有代码之后再执行这里的代码 }) 选择器: &('#id');      获取id &('.class');   ...

  6. iOS 为label加删除线

    NSString *oldPrice = [NSString stringWithFormat:@"原价 %@",_item.previousPrice.stringValue]; ...

  7. 用介个新的blog咯..

    之前csdn实在是太卡了.. 只要一写比较长的blog就卡的要死.. 转过来这吧,比较好吧.. 原blog地址 啊为啥域名叫darklove呢.. 这是很久之前创建的.. 简单来说是一个和clearl ...

  8. HDU 3308 LCIS(线段树)

    题目链接 模板题吧,忘了好多,终于A了... #include <cstring> #include <cstdio> #include <string> #inc ...

  9. Hello Java

    用记事本或者Eclipse编写如下代码 public class JavaAPP{       public static void main(String[] args){       System ...

  10. Eclipse中的文件导航插件StartExplorer

    在Eclipse里面,想找到文件的位置是件麻烦的事,需要借助插件,我用的是StartExplorer插件. StartExplorer官方地址:http://startexplorer.sourcef ...