PostgreSQL中的distinct on
条评论想象有这么一张表,存放若干学生不同课程的考试成绩,需求是,找出每门课程中,成绩最好的学生。原始表大概如下:
+--------------------------------------+-----------------+----------------+-----------+ |
传统方案
传统的方法,要找每门课程成绩最好的学生的话,需要借助聚合函数,而且要几步操作:
- 找到每门课程的最好成绩
select v_coursename, max(i_score)
from achievement
group by v_coursename; - 再跟
achievement
表join
,才能找到该课程最高分对应的学生姓名。即使在有CTE
支持的情况下,实现起来也很复杂要是没有with cte as (select v_coursename, max(i_score) as i_score from achievement group by v_coursename)
select cte.*, achievement.v_studentname
from cte
join achievement on cte.i_score = achievement.i_score and cte.v_coursename = achievement.v_coursename
order by cte.v_coursename;CTE
的支持,估计用纯数据库实现,就捉襟见肘了。
使用distinct on的方案
select distinct on (v_coursename) * |
一句话解决,是不是很开森。
原理回顾
DISTINCT ON
是将结果集按指定字段值的去重,具体实现方法是先对结果集按照DISTINCT ON
指定的字段进行排序,然后筛选出每个字段第一次出现时所在的记录,其余的记录都剔除。ON
修饰符支持多列,运算时会基于多列的总体唯一性进行去重操作。同时查询语句必须要有ORDER BY
,并且要保证排序字段从左至右的的顺序,应该是跟DISTINCT ON
命中字段顺序相符合,当然ORDER BY
可以追加更多的字段。
本文标题:PostgreSQL中的distinct on
文章作者:牧云踏歌
发布时间:2018-08-09
最后更新:2018-08-09
原始链接:http://www.kankanzhijian.com/2018/08/09/PostgreSQL_distinct-on/
版权声明:本博客文章均系本人原创,转载请注名出处