SQLite percent_rank() 函数使用指南

来源:这里教程网 时间:2026-03-25 18:41:26 作者:

SQLite

percent_rank()
函数返回当前行所在的分区内的相对排名,也就是
(rank() - 1) / (分区总行数 - 1)

percent_rank()
语法

这里是 SQLite

percent_rank()
函数的语法:

percent_rank()OVER (  [PARTITION BY partition_column_list]  [ORDER BY order_column_list])

参数

partition_column_list
参与分区的列的列表。
order_column_list
参与排序的列的列表。

返回值

SQLite

percent_rank()
函数返回一个介于 0 和 1 (包含) 之间的数,表示当前行所在的分区内的相对排名,其计算公式为是
(rank() - 1) / (分区总行数 - 1)

percent_rank()
示例

演示数据准备

使用下面的

CREATE TABLE
语句创建一个表
student_grade
以存储学生的班级和成绩:

CREATE TABLE student_grade (  id INTEGER 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

按照科目查看每个学生的成绩的相对排名

要查看在每个科目中每个学生按照成绩从高到低的相对排名,请使用如下语句:

SELECT *,  rank() OVER (    PARTITION BY subject    ORDER BY grade DESC  ) rank,  percent_rank() OVER (    PARTITION BY subject    ORDER BY grade DESC  ) percent_rankFROM student_grade;

id  name  class  subject  grade  rank  percent_rank--  ----  -----  -------  -----  ----  ------------5   Tom   A      English  8      1     0.0         12  Susy  B      English  8      1     0.0         4   Tim   A      English  7      3     0.4         6   Jim   A      English  7      3     0.4         11  Jody  B      English  7      3     0.4         10  Lucy  B      English  6      6     1.0         1   Tim   A      Math     9      1     0.0         9   Susy  B      Math     9      1     0.0         3   Jim   A      Math     8      3     0.4         7   Lucy  B      Math     8      3     0.4         2   Tom   A      Math     7      5     0.8         8   Jody  B      Math     6      6     1.0         

注意,上面 SQL 语句中的窗口函数:

percent_rank() OVER (  PARTITION BY subject  ORDER BY grade DESC)

OVER
子句中,

PARTITION BY subject
将按照学科进行分区
ORDER BY grade DESC
将每个分区内的行按照成绩逆序排列。
percent_rank()
返回每行在其关联的分区内的相对排名。

您从上面也可以看出

percent_rank()
rank()
的不同。

按照班级查看每个学生的总成绩的相对排名

要查看在每个班级中每个学生按照总成绩从高到底的相对排名,请使用下面的语句:

SELECT t.*,  percent_rank() OVER (    PARTITION BY class    ORDER BY t.sum_grade DESC  ) percent_rankFROM (    SELECT class,      name,      sum(grade) sum_grade    FROM student_grade    GROUP BY class, name  ) t;

class  name  sum_grade  percent_rank-----  ----  ---------  ------------A      Tim   16         0.0         A      Jim   15         0.5         A      Tom   15         0.5         B      Susy  17         0.0         B      Lucy  14         0.5         B      Jody  13         1.0         

在上面的语句中,注意这个子查询:

SELECT class,  name,  sum(grade) sum_gradeFROM student_gradeGROUP BY class, name

这个子查询使用

GROUP BY
子句和
sum()
按照班级和学生汇总出每个学生的总成绩。

class  name  sum_grade-----  ----  ---------A      Jim   15       A      Tim   16       A      Tom   15       B      Jody  13       B      Lucy  14       B      Susy  17       

主语句在从这个子查询中按照班级进行分区,然后在每个分区内按照总成绩逆序排序,并使用

percent_rank()
返回每行在其关联的分区内的相对排名。

相关推荐

热文推荐