博客
关于我
Postgresql distinct/ distinct on
阅读量:392 次
发布时间:2019-03-05

本文共 1982 字,大约阅读时间需要 6 分钟。

PostgreSQL 中的 DISTINCT 和 DISTINCT ON

在 PostgreSQL 中,DISTINCTDISTINCT ON 是用来消除重复记录的重要工具。理解它们的区别和用法对于优化查询和处理数据是至关重要的。本文将详细解析这两种功能,并通过实例展示其应用。


NULL 在 DISTINCT 中的处理

在 PostgreSQL 中,NULL 值在 DISTINCT 中被特殊对待。具体来说,NULL 被视为与其他 NULL 相等的值。例如:

postgres=# create table t3 (id int);postgres=# insert into t3 values (1);postgres=# insert into t3 values (2);postgres=# insert into t3 values (null);postgres=# insert into t3 values (null);postgres=# insert into t3 values (null);postgres=# select distinct id from t3;

执行上述命令会发现,尽管插入了三个 NULLselect distinct id 的结果中只包含两个记录。这是因为 NULL 被视为相同的值,根据 DISTINCT 的规则,所有相同的记录只保留一条。


DISTINCT ON 的用法

DISTINCT ON 的功能比 DISTINCT 更强,它允许你根据指定的表达式对记录进行分组,并只保留每组的第一条记录。它的基本形式如下:

select distinct on (expression) column1, column2, ... from table;

工作原理

  • 表达式的评估:对于每一条记录,expression 被计算。
  • 分组:所有具有相同 expression 值的记录被分组。
  • 保留第一条记录:每个分组中只保留第一条记录。
  • 需要注意的是,如果没有使用 ORDER BY 子句,返回的第一条记录是不可预测的。为了确保结果的确定性,最好在 DISTINCT ON 中使用 ORDER BY 子句,并确保排序列在 expression 的左边。


    DISTINCT ON 的实际应用示例

    以下是一个典型的应用场景:从一个名单中提取每个人在各个科目上的最高成绩。

    postgres=# CREATE TABLE score_ranking (id int, name text, subject text, score numeric);postgres=# INSERT INTO score_ranking VALUES     (1,'killerbee','数学',99.5),     (2,'killerbee','语文',89.5),    (3,'killerbee','英语',79.5),     (4,'killerbee','物理',99.5),     (5,'killerbee','化学',98.5),    (6,'刘德华','数学',89.5),     (7,'刘德华','语文',99.5),     (8,'刘德华','英语',79.5),    (9,'刘德华','物理',89.5),     (10,'刘德华','化学',69.5),    (11,'张学友','数学',89.5),     (12,'张学友','语文',91.5),     (13,'张学友','英语',92.5),     (14,'张学友','物理',93.5),     (15,'张学友','化学',94.5);postgres=# select distinct on (subject) id, name, subject, score from score_ranking order by subject, score desc;

    执行上述查询后,你将获得每科的最高分记录:

    id name subject score
    5 killerbee 化学 98.5
    1 killerbee 数学 99.5
    4 killerbee 物理 99.5
    13 张学友 英语 92.5
    7 刘德华 语文 99.5

    注意事项

  • 排序依赖:如果没有使用 ORDER BY,结果的顺序是不可预测的。
  • 表达式的顺序:在 ORDER BY 子句中,排序列必须出现在 DISTINCT ON 表达式的左边。
  • 多列支持DISTINCT ON 支持多个表达式,如 distinct on (id, subject)
  • 通过合理运用 DISTINCT ON,你可以显著简化数据处理任务,并提高查询性能。

    转载地址:http://rbowz.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NHibernate学习[1]
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>