Oracle vs PostgreSQL Develop(15) - DISTINCT ON
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,平时在客户业务的数据分析中,经常有这么一种需求,那就是希望得到某个组里面某些字段最大或最小的记录.比如雇员表:[local]:5432 pg12@testdb=# \d employee
千家信息网最后更新 2025年11月07日Oracle vs PostgreSQL Develop(15) - DISTINCT ON
平时在客户业务的数据分析中,经常有这么一种需求,那就是希望得到某个组里面某些字段最大或最小的记录.
比如雇员表:
[local]:5432 pg12@testdb=# \d employee Table "public.employee" Column | Type | Collation | Nullable | Default ------------+-----------------------+-----------+----------+--------- id | integer | | | name | character varying(30) | | | department | character varying(30) | | | salary | double precision |我们通过 MockData生成测试数据,共1000行,department共有12个.
[local]:5432 pg12@testdb=# select count(*) from employee; count ------- 1000(1 row)Time: 22.747 ms[local]:5432 pg12@testdb=# select distinct department from employee; department -------------------------- Marketing Training Sales Business Development Product Management Research and Development Support Legal Accounting Services Human Resources Engineering(12 rows)Time: 2.616 ms下面希望得到每个department中salary中最大的employee.
常规的做法是使用分组求得最大值/最小值,然后进行关联查询:
[local]:5432 pg12@testdb=# select a.* from employee a,(select department,max(salary) as salary from employee group by department) b pg12@testdb-# where a.department = b.department and a.salary = b.salary order by a.department; id | name | department | salary -----+--------------------+--------------------------+--------- 453 | Ericha Hendrikse | Accounting | 9958.5 307 | Kyle Hartegan | Business Development | 9754.93 969 | Odelinda Marsden | Engineering | 9942.3 201 | Glen Kasperski | Human Resources | 9559.54 892 | Mirabelle Lesslie | Legal | 9720.49 214 | Chane Koschek | Marketing | 9943.86 371 | Josy Ayliff | Product Management | 9975.48 191 | Meir Alvaro | Research and Development | 9870 770 | Adoree de Guerre | Sales | 9808.65 370 | Benoite Overlow | Services | 9884.79 866 | Shirlee McIlherran | Support | 9884.08 586 | Renae Jerromes | Training | 9904.24(12 rows)Time: 8.256 ms[local]:5432 pg12@testdb=#这种方法有个问题是如果max salary有多条记录的话,上述查询的结果会有多条.
PostgreSQL提供了DISTINCT ON,可简单实现该需求
[local]:5432 pg12@testdb=# SELECT DISTINCT ON (department)pg12@testdb-# *pg12@testdb-# FROMpg12@testdb-# employeepg12@testdb-# ORDER BYpg12@testdb-# department,pg12@testdb-# salary DESC; id | name | department | salary -----+--------------------+--------------------------+--------- 453 | Ericha Hendrikse | Accounting | 9958.5 307 | Kyle Hartegan | Business Development | 9754.93 969 | Odelinda Marsden | Engineering | 9942.3 201 | Glen Kasperski | Human Resources | 9559.54 892 | Mirabelle Lesslie | Legal | 9720.49 214 | Chane Koschek | Marketing | 9943.86 371 | Josy Ayliff | Product Management | 9975.48 191 | Meir Alvaro | Research and Development | 9870 770 | Adoree de Guerre | Sales | 9808.65 370 | Benoite Overlow | Services | 9884.79 866 | Shirlee McIlherran | Support | 9884.08 586 | Renae Jerromes | Training | 9904.24(12 rows)Time: 11.445 msExcellent Feature!
参考资料
The Many Faces of DISTINCT in PostgreSQL
最大
最小
多条
数据
需求
查询
业务
做法
参考资料
字段
客户
就是
常规
数据分析
方法
最大值
结果
资料
问题
雇员
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
甲骨文软件开发
服务器有木马危险吗
网络技术人员保密协议如何签
网络技术及其应用试卷
微信服务号服务器
惠州学院数据库基础教程考点
江阴软件开发商
以网络安全法为主题的作文
读秀学术资源数据库
企业网络安全论文致谢女朋友
济南定制软件开发教程
nds游戏自建服务器
软件开发工具的英文是
数据库安全的第一道保障是啥
郑州消防网络安全中标
联通拨号服务器不响应
2020网络安全大会举办
计算机网络技术是怎样出现的
绥化软件开发培训学校
数据库连接需要open吗
泰拉瑞亚手机版服务器怎么登录
东软网络安全技术
福州拔萃网络技术
节点数据库
我的世界网易如何一直开服务器
走网络安全必须要研究生吗
软件开发 流程 方案
缺乏专业数据库
2019学什么网络技术好
tgp饥荒服务器怎么加管理