PostgreSQL 数据库中 DISTINCT 关键字的 4 种用法

文章目录

        DISTINCT
        DISTINCT ON
        IS DISTINCT FROM
        聚合函数与 DISTINCT

PostgreSQL 不但高度兼容 SQL 标准,同时还对很多语法进行了扩展,可以用于实现一些特殊的功能。今天我们就来介绍一下 PostgreSQL 数据库中 DISTINCT 关键字的 4 种不同用法。

本文示例数据点此下载,如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁
DISTINCT

按照 SQL 标准,SELECT DISTINCT可以在返回查询结果之前去除重复的记录,每个重复的数据组中只保留一条记录。例如:

SELECT DISTINCT dept_id, sex
FROM employee;

dept_id|sex|
-------|---|
      4|男  |
      1|男  |
      4|女  |
      5|男  |
      3|女  |
      2|男  |



以上语句中的 DISTINCT 表示返回不同部门 id 和性别的组合值。我们也可以使用 GROUP BY 实现相同的结果:

SELECT dept_id, sex
FROM employee
GROUP BY dept_id, sex;



    📝按照 SQL 标准,多个 NULL 值对于 DISTINCT 而言属于相同的分组。

DISTINCT ON

考虑一个问题:每个部门中月薪最高的员工都是谁?这个问题可以使用多种实现方法:

-- 子查询
SELECT dept_id, emp_name,salary
FROM employee
WHERE (dept_id, salary) IN ( SELECT dept_id, MAX(salary)
                             FROM employee
                             GROUP BY dept_id );

dept_id|emp_name|salary  |
-------|--------|--------|
      1|刘备     |30000.00|
      2|诸葛亮    |24000.00|
      3|孙尚香    |12000.00|
      4|赵云     |15000.00|
      5|法正     |10000.00|

-- 窗口函数
WITH ranked_employee AS (
  SELECT dept_id, emp_name, salary, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) rn
  FROM employee
)
SELECT *
FROM ranked_employee
WHERE rn = 1;

dept_id|emp_name|salary  |rn|
-------|--------|--------|--|
      1|刘备     |30000.00| 1|
      2|诸葛亮    |24000.00| 1|
      3|孙尚香    |12000.00| 1|
      4|赵云     |15000.00| 1|
      5|法正     |10000.00| 1|


其中,第一个语句使用了子查询;第二个语句使用了窗口函数,除了 ROW_NUMBER 之外,也可以使用 RANK 或者 DENSE_RANK 等函数。这两者都是 SQL 标准实现。

除此之外,PostgreSQL 提供了扩展的 DISTINCT ON 子句,可以更加方便地实现以上结果:

SELECT DISTINCT ON (dept_id) dept_id, emp_name, salary
FROM employee
ORDER BY dept_id, salary DESC;

dept_id|emp_name|salary  |rn|
-------|--------|--------|--|
      1|刘备     |30000.00| 1|
      2|诸葛亮    |24000.00| 1|
      3|孙尚香    |12000.00| 1|
      4|赵云     |15000.00| 1|
      5|法正     |10000.00| 1|



其中,DISTINCT ON (dept_id) 表示部门 id 相同的数据组,返回其中的第一条记录;ORDER BY 子句确保了返回的是每个部分中月薪最高的记录。DISTINCT ON 中的字段或表达式(可能多个)必须和 ORDER BY 最左侧的几个字段或表达式相同。
IS DISTINCT FROM

空值(NULL)是数据库中的一个特殊值,通常用于表示缺失值或者不适用的值。空值的比较是一个比较容易出错的问题。例如:
 

更多请见:http://www.mark-to-win.com/tutorial/51567.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值