窗口函数可以实现分组后排序
CREATE TABLE public.subject_score (
id bigserial NOT NULL,
"name" varchar NULL,
subject varchar NULL,
score float8 NULL,
create_time timetz NULL DEFAULT now()
);
insert into subject_score(name,subject,score) values('张三','语文',77),
('李四','语文',77),('张三','数学',80),('张三','英语',56),('李四','英语',77)
,('李四','数学',66),('王五李四','数学',99),('王五','英语',40),('王五','语文',100);
select
name,
subject,
score,
rank() over(partition by subject
order by
score desc) as rk
from
subject_score ss;
name|subject|score|rk|
----+-------+-----+--+
王五 |数学 | 99.0| 1|
张三 |数学 | 80.0| 2|
李四 |数学 | 66.0| 3|
李四 |英语 | 77.0| 1|
张三 |英语 | 56.0| 2|
王五 |英语 | 40.0| 3|
王五 |语文 |100.0| 1|
张三 |语文 | 77.0| 2|
李四 |语文 | 77.0| 2|
- row_number 严格排序,不会出现重复的排序
select
name,
subject,
score,
row_number() over(partition by subject
order by
score desc) as rk
from
subject_score ss;
name|subject|score|rk|
----+-------+-----+--+
王五 |数学 | 99.0| 1|
张三 |数学 | 80.0| 2|
李四 |数学 | 66.0| 3|
李四 |英语 | 77.0| 1|
张三 |英语 | 56.0| 2|
王五 |英语 | 40.0| 3|
王五 |语文 |100.0| 1|
张三 |语文 | 77.0| 2|
李四 |语文 | 77.0| 3|