KingbaseES 中select distinct on 语句

用法
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 ...
posted @ 2022-06-25 10:59  KINGBASE研究院  阅读(96)  评论(0编辑  收藏  举报