用法

SELECT DISTINCT ON ( expression [, ...] )

把记录根据[, …]的值进行分组,分组之后仅返回每一组的第一行。

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

例子

构造数据
create table student(id serial,name character varying,course character varying,score integer);
insert into student (name,course,score) values('张三','语文',89);
insert into student (name,course,score) values('张三','数学',99);
insert into student (name,course,score) values('张三','外语',84);
insert into student (name,course,score) values('张三','物理',77);
insert into student (name,course,score) values('张三','化学',87);
insert into student (name,course,score) values('李四','语文',91);
insert into student (name,course,score) values('李四','数学',81);
insert into student (name,course,score) values('李四','外语',88);
insert into student (name,course,score) values('李四','物理',68);
insert into student (name,course,score) values('李四','化学',83);
insert into student (name,course,score) values('王五','语文',85);
insert into student (name,course,score) values('王五','数学',65);
insert into student (name,course,score) values('王五','外语',95);
insert into student (name,course,score) values('王五','物理',90);
insert into student (name,course,score) values('王五','化学',78);

1.当没用指定order by子句的时候随机返回一行。

test=# select distinct on(course)id,name,course,score from student;
id | name | course | score
----+------+--------+-------
10 | 李四 | 化学 | 83
7 | 李四 | 数学 | 81
8 | 李四 | 外语 | 88
4 | 张三 | 物理 | 77
1 | 张三 | 语文 | 89
(5 行记录)

2.使用order by子句获取每门学科最高/最低分。

test=# select distinct on(course)id,name,course,score from student order by course,score;
id | name | course | score
----+------+--------+-------
15 | 王五 | 化学 | 78
12 | 王五 | 数学 | 65
3 | 张三 | 外语 | 84
9 | 李四 | 物理 | 68
11 | 王五 | 语文 | 85
(5 行记录) test=# select distinct on(course)id,name,course,score from student order by course,score desc;
id | name | course | score
----+------+--------+-------
5 | 张三 | 化学 | 87
2 | 张三 | 数学 | 99
13 | 王五 | 外语 | 95
14 | 王五 | 物理 | 90
6 | 李四 | 语文 | 91
(5 行记录)
  1. 如果指定order by子句必须把分组的字段放在最左边
test=# select distinct on(course)id,name,course,score from student order by score desc,course;
错误: 表达式SELECT DISTINCT ON必须匹配初始化的ORDER BY表达式
第1行select distinct on(course)id,name,course,score from student ...

KingbaseES 中select distinct on 语句的更多相关文章

  1. mysql中select distinct的用法

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但 往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...

  2. mysql中select distinct的使用方法

    在使用mysql时,有时须要查询出某个字段不反复的记录,尽管mysql提供有distinct这个keyword来过滤掉多余的反复记录仅仅保留一条,但往往仅仅用它来返回不反复记录的条数,而不是用它来返回 ...

  3. 数据库中Select For update语句的解析

    ----------- Oracle -----------------– Oracle 的for update行锁 键字: oracle 的for update行锁 SELECT-FOR UPDAT ...

  4. SQL中的多表联查(SELECT DISTINCT 语句)

    前言:(在表中,可能会包含重复值.这并不成问题,不过,有时你也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值.) 如果不加DISTINCT 的话,主表本来 ...

  5. LINQ to SQL语句(2)之Select/Distinct

    适用场景:o(∩_∩)o- 查询呗. 说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来:延迟.Select/ ...

  6. 容易被忽略的事----sql语句中select语句的执行顺序

    关于Sql中Select语句的执行顺序,一直很少注意这个问题,对于关键字的使用也很随意,至于效率问题,因为表中的数据量都不是很大,所以也不是很在意. 今天在一次面试的时候自己见到了,感觉没一点的印象, ...

  7. LINQ to SQL 语句(2)之 Select/Distinct

    LINQ to SQL 语句(2)之 Select/Distinct [1] Select 介绍 1 [2] Select 介绍 2 [3] Select 介绍 3 和  Distinct 介绍 Se ...

  8. [转]LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg

    在讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ ...

  9. SQL SELECT DISTINCT 语句

    SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法 ...

随机推荐

  1. linux shell的配置文件执行顺序

    shell配置文件的作用:初始化环境变量.设置命令提示符.指定系统命令路径等 shell配置文件分类: (1)系统级别配置文件: /etc下,比如/etc/profile./etc/bashrc (2 ...

  2. mysql备份数据库linux

    备份数据库 问题描述: ​ 我们用的是mysql,以今天遇到的情况为例,我们是在两台服务器上要搭相同的平台,部署完成后页面报错,发现是数据库的问题,我们打开数据库查看,确实数据库中少建一个wind数据 ...

  3. IDEA Unicode码转中文

    1.打开设置 2.打开文件编码设置,按如图设置

  4. 从UI Designer上面动态创建下拉列表

    在UI Desigher上创建一个新的列表 并创建2个值,code 和value 添加一个EventHandler 在EventHandler上面添加一个Operation 类型为script$dat ...

  5. 深入理解 Java 对象的内存布局

    对于 Java 虚拟机,我们都知道其内存区域划分成:堆.方法区.虚拟机栈等区域.但一个对象在 Java 虚拟机中是怎样存储的,相信很少人会比较清楚地了解.Java 对象在 JVM 中的内存布局,是我们 ...

  6. Tapdata 与阿里云 PolarDB 开源数据库社区联合共建开放数据技术生态

      近日,阿里云 PolarDB 开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态.在此之际,一直专注实时数据服务平台的 Tapdata ,也宣布开源其数据源开发框架--PDK(Plu ...

  7. 生成RSA密钥的方法[转载]

    openssl genrsa -des3 -out privkey.pem 2048 这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成(测试常 ...

  8. IDEA的概述和IDEA的安装

    开发工具概述 IDEA是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量. 它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中 ...

  9. SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?

    在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间:SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件 ...

  10. 【docker专栏5】详解docker镜像管理命令

    一.国内Docker镜像仓库 由于大家都知道的原因,从国外的docker 仓库中pull镜像的下载速度实际上是很慢的.国内的一些一线厂商以及docker官方都在国内免费提供了一些docker镜像仓库, ...