相关文章推荐
另类的毛衣  ·  C++ 知识点 - ...·  3 月前    · 
潇洒的茴香  ·  如何使用python ...·  1 年前    · 
select DISTINCT ON ( p . person_id ) p . person_id as personId , p . person_type as personType , p . job_number as jobNumber , p . name , p . idcard as idcard , p . sex , p . company , p . owner_company as ownerCompany , p . phone , p . status , p . update_time , p . create_time from smc_person p left join smc_car sc on ( ( sc . driver ~ p . person_id : : VARCHAR ) = 't' and sc . status = '1' ) where p . status = '1' order by p . create_time desc , p . update_time desc nulls last , p . name asc

此时报错:
SELECT DISTINCT ON expressions must match initial ORDER BY expressions

原因分析:

查询官方文档: DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行等于。 [...]注意,除非使用ORDER BY来确保所需的行首先出现,否则每个集合的"第一行"都是不可预测的。 [...] DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配。 ----------DISTINCT ON 中的字段,必须位于order by 的最左边

解决方案:

我不想根据p.person_id来排序。可以采用如下写法:

SELECT * FROM(
select DISTINCT ON(p.person_id)
p.person_id       as personId,
               p.person_type     as personType,
               p.job_number      as jobNumber,
               p.name,
               p.idcard          as idcard,
               p.sex,
               p.company,
               p.owner_company   as ownerCompany,
               p.phone,
               p.status,
               p.update_time,
               p.create_time
        from smc_person p
                     left join smc_car sc on ((sc.driver ~ p.person_id::VARCHAR) = 't' and sc.status = '1')
                where p.status = '1')t
        order by p.create_time desc, p.update_time desc nulls last, p.name asc
                    问题描述:PostgreSQL 中使用distinct on() 分组时报错// sql语句select DISTINCT ON(p.person_id)p.person_id       as personId,               p.person_type     as personType,               p.job_number      as jobNumber,               p.name,               p.idcard  
				
当一条sql语句中同时使用DISTINCT和created_at时,可能会出现 ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list错误信息 例如:select DISTINCT id from insure ORDER BY created_at; 翻译意思就是:错误:选择不同,O
解决办法:sqlserver中如果同时用order bydistinct,那order by后面的字段就必须出现在selcet的字段中。这个问题只有在sqlserver中才会有,mysql中是不会有这个问题的。 如果这样写会提示错误: select distinct name from user order by id 应该这样写: select distinct id,name from us...
SELECT distinct example_column1 FROM test.example_table where delisting_date>now() and product ='CU.SHF' ORDER BY `example_column2` ASC; 报错信息如下:(MySQL-8.0.16可以正常运行,MySQL-5.7报错) Error Code: 3... SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 SELECT DISTINCT column_name,column_name FROM table_name; 在本教程中,我们将使用 RUNOOB 样本数据库。 下面是选自 “Websites” 表的数据: +----+--------------+- SELECT DISTINCT ON ( expression [, ...] ) 把记录根据[, …]的值进行分组,分组之后仅返回每一组的第一行。 需要注意的是,如果不指定ORDER BY子句,返回的第一条记录是不确定的。如果你使用了ORDER BY 子句,那么[, …]里面的值必须靠近ORDER BY子句的最左边。 create table student(id ser...
在pgsql使用过程中有一个需求,是需要根据一个字段去重其他字段不去重,然后查询出表中的字段。这里就要说到group bydistinct两种。 group by吧,就是需要使用聚合函数,但我只有某一个字段(name字段)有需求,其他的字段按照原来的展示。但是在使用聚合函数不符合预期,所以就放弃。 distinct,这个是只能去重一个字段,但是不能查询出表中字段。比如我就只是针对name去重...
SELECT DISTINCT select_list … (NULL在DISTINCT [ON] 中视为相等) show code postgres=# create table t3 (id int ); CREATE TABLE postgres=# insert into t3 values (1); INSERT 0 1 postgres=# insert into t3 values (
1. DISTINCTORDER BY的顺序 在MySQL中,DISTINCTORDER BY的顺序非常重要。如果你想让结果集按照某个字段去重,并按照另一个字段排序,那么应该先使用DISTINCT,再使用ORDER BY。例如: SELECT DISTINCT column1, column2 FROM table1 ORDER BY column2; 这个查询会先对column1去重,然后按照column2排序。 2. ORDER BY的字段必须在SELECT中出现 如果你想按照某个字段排序,那么这个字段必须在SELECT中出现。例如: SELECT DISTINCT column1 FROM table1 ORDER BY column2; 这个查询会报错,因为column2不在SELECT中出现。 3. 使用子查询解决问题 如果在某些情况下,你无法在同一个查询中使用DISTINCTORDER BY,可以考虑使用子查询来解决问题。例如: SELECT column1, column2 FROM (SELECT DISTINCT column1 FROM table1) t1 ORDER BY column2; 这个查询先对column1去重,然后将结果作为子查询,再按照column2排序。