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

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

作者:瀚高PG实验室 (Highgo PG Lab)- 狮子歌歌

  • SELECT DISTINCT select_list … (NULL在DISTINCT [ON] 中视为相等)

show code

postgres=# create table t3 (id int );CREATE TABLEpostgres=# insert into t3 values (1);INSERT 0 1postgres=# insert into t3 values (2);INSERT 0 1postgres=# insert into t3 values (null);INSERT 0 1postgres=# insert into t3 values (null);INSERT 0 1postgres=# insert into t3 values (null);INSERT 0 1postgres=# select * from t3 ; id ----  1  2         (5 rows)postgres=# select distinct id from t3 ; // 这个结果证明了 null 在postgresql里被视为相等 id ----     1  2(3 rows)
  • DISTINCT ON 的用法

Here expression is an arbitrary value expression that is evaluated for all rows. A

set of rows for which all the expressions are equal are considered duplicates, and
only the first row of the set is kept in the output. Note that the “first row” of a set is
unpredictable unless the query is sorted on enough columns to guarantee a unique
ordering of the rows arriving at the DISTINCT filter. (DISTINCT ON processing
occurs after ORDER BY sorting.)

意思是DISTINCT ON ( expression [, …] )把记录根据[, …]的值进行分组,分组之后仅返回每一组的第一行。

需要注意的是,如果你不指定ORDER BY子句,返回的第一条的不确定的。如果你使用了ORDER BY 子句,
那么[, …]里面的值必须靠近ORDER BY子句的最左边。

废话不多说, 举个例子吧:

postgres=# CREATE TABLE score_ranking (id int, name text, subject text, score numeric);CREATE TABLEpostgres=# 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);INSERT 0 15//先查看下当前表的内容。postgres=# postgres=# select * from score_ranking ; id |   name    | subject | score ----+-----------+---------+-------  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(15 rows)//以下就是 distict on 的用法://取出每门课程的第一名.postgres=# select distinct on (subject) id,name,subject,score from score_ranking order by subject,score desc;备注:逻辑是: 先依据subject进行分组,比如如果subject有五类,那就分成5组。其次,score desc决定每一组内部排序,最终决定每组取谁。 id |   name    | subject | score ----+-----------+---------+-------  5 | killerbee | 化学    |  98.5  1 | killerbee | 数学    |  99.5  4 | killerbee | 物理    |  99.5 13 | 张学友    | 英语    |  92.5  7 | 刘德华    | 语文    |  99.5(5 rows)//当没用指定ORDER BY子句的时候返回的记录是不确定的。postgres=# select distinct on (subject) id,name,subject,score from score_ranking ; id |   name    | subject | score ----+-----------+---------+-------  5 | killerbee | 化学    |  98.5  1 | killerbee | 数学    |  99.5  4 | killerbee | 物理    |  99.5 13 | 张学友    | 英语    |  92.5  2 | killerbee | 语文    |  89.5(5 rows)//by score,subject desc; 这里有固定格式,具体可以自己体会。 否则报错:postgres=# select distinct on (subject) id,name,subject,score from score_ranking order by score,subject desc;ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressionsLINE 1: select distinct on (subject) id,name,subject,score from scor...// distinct on (括号里也能跟两个参数)postgres=# select distinct on (id ,subject) id,name,subject,score from score_ranking order by id,subject,score desc; id |   name    | subject | score ----+-----------+---------+-------  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(15 rows)

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

你可能感兴趣的文章
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>
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实现原理
查看>>