pgsql中distinct on的用法

在pgsql使用过程中有一个需求,是需要根据一个字段去重其他字段不去重,然后查询出表中的字段。这里就要说到group by、distinct两种。

group by吧,就是需要使用聚合函数,但我只有某一个字段(name字段)有需求,其他的字段按照原来的展示。但是在使用聚合函数不符合预期,所以就放弃。

distinct,这个是只能去重一个字段,但是不能查询出表中字段。比如我就只是针对name去重后在查询所有字段。显然是不满足我的要求。

后来,baidu到了distinct on。

select distinct on(去重列名), * from 表。可以针对某一个字段去重然后查询出全部字段展示。完美使用。

但是要明确一下,添加order by子句。

当没有使用order by时,返回的数据是不能确定的。

ps:如果查询全表可以这么写:select distinct on( course) * from student;--* 代表全部字段

可以这么写:select distinct on(course) course, id,name,score from student;--即列出全部字段

postgres=# select distinct on(course) * from student;
 id |  name  | course | score   
----+--------+--------+------- 
 10 | 黎明   | 化学   |    83  
  8 | 周润发 | 外语   |    88  
  2 | 黎明   | 数学   |    97
 14 | 周星驰 | 物理   |    68  
  6 | 黎明   | 语文   |    85  
(5 rows)

添加order by子句后明确取去重后的最高的数据。 返回的第一条数据是确定的,可以实现取最XXX的一条数据

postgres=# select distinct on(course) course, score * from student order by course, score desc ;
 id |  name  | course | score   
----+--------+--------+------- 
  5 | 周润发 | 化学   |    87  
 13 | 黎明   | 外语   |    95
  2 | 黎明   | 数学   |    99
 14 | 周星驰 | 物理   |    90
  6 | 黎明   | 语文   |    91  
(5 rows)

文章内容部分转载。

https://www.cnblogs.com/xsjs/p/10971752.html

https://www.cnblogs.com/zhangfx01/p/10215726.html

此网址可拓展相关知识点:https://blog.csdn.net/luojinbai/article/details/45078809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值