PostgreSQL distinct on 用法
PostgreSQL About 1,721 words作用
distinct on
先将记录按on
中指定的字段分组后返回第一条。
注意
order by
必须是on
中指定的字段顺序,指定字段之后再添加其他字段。
如果没有order by
则随机取一条。
数据准备
score
分数表:name
姓名、class
班级、score
分数。
create table if not exists score(name text, class text, score int);
insert into score values ('张三', '一班', '语文', 90);
insert into score values ('张三', '一班', '数学', 95);
insert into score values ('张三', '一班', '英语', 95);
insert into score values ('李四', '一班', '语文', 100);
insert into score values ('李四', '一班', '数学', 80);
insert into score values ('李四', '一班', '英语', 95);
insert into score values ('王五', '一班', '语文', 90);
insert into score values ('王五', '一班', '数学', 100);
insert into score values ('王五', '一班', '英语', 90);
查询各学科最高分
取subject
分组的第一条,并按subject
、score
、name
排序。
select distinct on(subject) * from score order by subject, score desc, name;
输出
postgres=# select distinct on(subject) * from score order by subject, score desc, name;
name | class | subject | score
------+-------+---------+-------
王五 | 一班 | 数学 | 100
张三 | 一班 | 英语 | 95
李四 | 一班 | 语文 | 100
(3 rows)
与 distinct 区别
distinct
只能将select
查询的所有字段,一起分组。
与 group by 区别
有group by
的语句只能select
对应的group by
字段和聚合函数,不能select
其他字段。
select subject, max(score) from score group by subject;
输出
postgres=# select subject, max(score) from score group by subject;
subject | max
---------+-----
语文 | 100
英语 | 95
数学 | 100
(3 rows)
扩展
使用窗口函数实现查询各学科最高分功能。
select * from(
select *, row_number() over (partition by subject order by score desc, name) row_number from score
) temp
where row_number = 1;
输出
name | class | subject | score | row_number
------+-------+---------+-------+------------
王五 | 一班 | 数学 | 100 | 1
张三 | 一班 | 英语 | 95 | 1
李四 | 一班 | 语文 | 100 | 1
(3 rows)
Views: 1,276 · Posted: 2023-11-02
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...