PostgreSQL distinct on 用法
PostgreSQL 大约 1727 字作用
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)
阅读 179 · 发布于 2023-11-02
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
Vue 脚手架工具 Vue CLI阅读 496
-
Maven 父工程 dependencyManagement 管理依赖阅读 547
-
Telepresence 设置配置文件更改默认配置阅读 1119
-
软考-系统架构设计师:数据库设计过程阅读 2000
-
Windows10 Vmmen 进程无法结束解决办法阅读 5882
-
缓存穿透、缓存雪崩、缓存击穿、缓存污染阅读 2347
-
Linux -bash: rz: command not found阅读 2428
-
Windows 删除服务阅读 1373
-
PostgreSQL 转义特殊字符阅读 129
-
Vue-cli+webpack 配置接口代理解决跨域问题阅读 2664