PostgreSQL row_number() 函数
PostgreSQL row_number()
函数返回当前行所在的分区内的序号,从 1 开始。
row_number()
语法
这里是 PostgreSQL row_number()
函数的语法:
row_number() OVER ( [PARTITION BY partition_column_list] [ORDER BY order_column_list] )
复制
参数
partition_column_list
- 参与分区的列的列表。
order_column_list
- 参与排序的列的列表。
返回值
PostgreSQL row_number()
函数返回当前行所在的分区内的序号,从 1 开始。
row_number()
示例
演示数据准备
使用下面的 CREATE TABLE
语句创建一个表 student_grade
以存储学生的班级和成绩:
CREATE TABLE student_grade ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, class CHAR(1) NOT NULL, subject VARCHAR(20) NOT NULL, grade INT NOT NULL );
复制
这里创建了一个 student_grade
表,它有 5 个列:
id
- 行 ID,主键。name
- 学生的姓名。class
- 学生所在的班级。subject
- 科目的名称。grade
- 该科目的成绩。
使用下面的 INSERT
语句向 student_grade
表中插入一些行:
INSERT INTO student_grade (name, class, subject, grade) VALUES ('Tim', 'A', 'Math', 9), ('Tom', 'A', 'Math', 7), ('Jim', 'A', 'Math', 8), ('Tim', 'A', 'English', 7), ('Tom', 'A', 'English', 8), ('Jim', 'A', 'English', 7), ('Lucy', 'B', 'Math', 8), ('Jody', 'B', 'Math', 6), ('Susy', 'B', 'Math', 9), ('Lucy', 'B', 'English', 6), ('Jody', 'B', 'English', 7), ('Susy', 'B', 'English', 8);
复制
使用下面的 SELECT
语句检索表中的数据:
SELECT * FROM student_grade;
复制
id | name | class | subject | grade ----+------+-------+---------+------- 1 | Tim | A | Math | 9 2 | Tom | A | Math | 7 3 | Jim | A | Math | 8 4 | Tim | A | English | 7 5 | Tom | A | English | 8 6 | Jim | A | English | 7 7 | Lucy | B | Math | 8 8 | Jody | B | Math | 6 9 | Susy | B | Math | 9 10 | Lucy | B | English | 6 11 | Jody | B | English | 7 12 | Susy | B | English | 8 (12 rows)
复制
按照科目查看每个学生的成绩的排序号
要查看在每个科目中每个学生按照成绩从高到低的排序号,请使用如下语句:
SELECT *, row_number() OVER ( PARTITION BY subject ORDER BY grade DESC ) FROM student_grade;
复制
id | name | class | subject | grade | row_number ----+------+-------+---------+-------+------------ 12 | Susy | B | English | 8 | 1 5 | Tom | A | English | 8 | 2 11 | Jody | B | English | 7 | 3 4 | Tim | A | English | 7 | 4 6 | Jim | A | English | 7 | 5 10 | Lucy | B | English | 6 | 6 1 | Tim | A | Math | 9 | 1 9 | Susy | B | Math | 9 | 2 7 | Lucy | B | Math | 8 | 3 3 | Jim | A | Math | 8 | 4 2 | Tom | A | Math | 7 | 5 8 | Jody | B | Math | 6 | 6 (12 rows)
复制
注意,上面 SQL 语句中的窗口函数:
row_number() OVER ( PARTITION BY subject ORDER BY grade DESC )
复制
在 OVER
子句中,
PARTITION BY subject
将按照学科进行分区ORDER BY grade DESC
将每个分区内的行按照成绩逆序排列。row_number()
返回每行在其关联的分区内的序号。
按照班级查看每个学生的总成绩的排序号
要查看在每个班级中每个学生按照总成绩从高到底的排序号,请使用下面的语句:
SELECT t.*, row_number() OVER ( PARTITION BY class ORDER BY t.sum_grade DESC ) FROM ( SELECT class, name, sum(grade) sum_grade FROM student_grade GROUP BY class, name ) t;
复制
class | name | sum_grade | row_number -------+------+-----------+------------ A | Tim | 16 | 1 A | Jim | 15 | 2 A | Tom | 15 | 3 B | Susy | 17 | 1 B | Lucy | 14 | 2 B | Jody | 13 | 3 (6 rows)
复制
在上面的语句中,注意这个子查询:
SELECT class, name, sum(grade) sum_grade FROM student_grade GROUP BY class, name
复制
这个子查询使用 GROUP BY
子句和 sum()
按照班级和学生汇总出每个学生的总成绩。
class | name | sum_grade -------+------+----------- A | Tim | 16 A | Jim | 15 A | Tom | 15 B | Jody | 13 B | Lucy | 14 B | Susy | 17 (6 rows)
复制
主语句在从这个子查询中按照班级进行分区,然后在每个分区内按照总成绩逆序排序,并使用 row_number()
返回每行在其关联的分区内的排序号。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。