在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