MariaDB 10.3使用DISTINCT ON触发“Near ON处期望表达式”报错如何处理
问题解答
报错原因说明
你执行的SELECT DISTINCT ON (No, Branch) * FROM Table1 ORDER BY No, a DESC;语句报错,是因为DISTINCT ON是PostgreSQL独有的语法,MariaDB、MySQL均不支持该语法,并非MariaDB和MySQL之间的特性差异,因此你使用10.3.28版本的MariaDB执行时会触发语法错误。
符合需求的实现方案
你需要按No+Branch组合去重、保留每组Datetime最大值对应的完整行,MariaDB 10.2及以上版本支持窗口函数,可以直接用ROW_NUMBER()实现,完全避免GROUP BY场景下的非分组字段数据混杂问题:
SELECT ID, No, Branch, Datetime FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY No, Branch ORDER BY Datetime DESC) AS rn FROM Table1 ) t WHERE rn = 1;
上述逻辑中PARTITION BY No, Branch按指定字段分组,每组内按Datetime倒序排列,每组排名第一的行就是你需要的时间最大的完整记录。如果后续需要关联其他表取Name字段,可直接将上述查询作为子查询或CTE,基于No和Branch字段关联即可,所有原始字段都可正常调用。
如果是不支持窗口函数的旧版本MariaDB,也可以使用关联子查询方案:
SELECT t1.* FROM Table1 t1 INNER JOIN ( SELECT No, Branch, MAX(Datetime) AS max_dt FROM Table1 GROUP BY No, Branch ) t2 ON t1.No = t2.No AND t1.Branch = t2.Branch AND t1.Datetime = t2.max_dt;
注意该方案如果同一组内存在多条完全相同的最大Datetime记录时,会返回所有匹配行,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Dave Hamilton
相关产品推荐
相关产品推荐

