Oracle vs PostgreSQL Develop(15) - DISTINCT ON
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,平时在客户业务的数据分析中,经常有这么一种需求,那就是希望得到某个组里面某些字段最大或最小的记录.比如雇员表:[local]:5432 pg12@testdb=# \d employee
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
百单网互联网科技有限公司怎么样
江苏根荣互联网科技
互联网科技公司华为
唐信互联网科技
亿人帮互联网科技
互联网科技公司做什么
安控科技rtu产品工业互联网
宁夏众和广鑫互联网科技有限公司
互联网科技创新服务
新兴科技互联网创新大赛颁奖典礼
辽宁互联网新科技
本届互联网博览会上的黑科技
畅思互联网科技
东莞新华互联网科技学校
众安科技工业互联网合作
山东子淼互联网科技有限公司
云南省自由互联网科技有限公司
江苏互联网科技小贷
珠海东科互联网科技有限公司
互联网科技新闻
小米移动互联网科技园
深圳九邦互联网科技有限公司
华中科技大学互联网
新浪科技互联网
福州新华互联网科技学校 知乎
佳云科技和互联网广告
武汉健翔互联网络科技有限公司
昊天互联网科技有限公司
互联网科技和信息
洛阳共同富裕互联网科技有限公司