按ORDRE与ID_ADR_ORAS_CONCERNE分组查询MESSAGE_ZBUS_ORAS表全列数据问题
问题解决方案
你的原SQL无法返回全列的原因是:GROUP BY 语句要求SELECT后的非聚合字段必须全部出现在GROUP BY子句中,直接写m.*会触发语法错误。你需要的「相同维度去重保留最新行」需求更适合用窗口函数实现。
通用实现方案(支持窗口函数的数据库,如Oracle、MySQL 8.0+、PostgreSQL、SQL Server等)
SELECT * FROM ( SELECT m.*, ROW_NUMBER() OVER ( PARTITION BY m.ORDRE, m.ID_ADR_ORAS_CONCERNE ORDER BY m.SENT_DATE DESC ) AS row_num FROM OPTIMUM.MESSAGE_ZBUS_ORAS m ) t WHERE t.row_num = 1 ORDER BY t.ORDRE ASC, t.SENT_DATE ASC;
逻辑说明
- 窗口函数
ROW_NUMBER()会按照ORDRE和ID_ADR_ORAS_CONCERNE两个字段分区,每个分区内按SENT_DATE倒序排序,最新的记录行号标记为1 - 外层过滤仅保留行号为1的记录,即可实现「ORDRE和ID_ADR_ORAS_CONCERNE都相同时仅保留SENT_DATE最新的一行」的需求
- 最终的ORDER BY先按ORDRE升序,再按SENT_DATE升序,完全匹配你的排序规则要求
老版本MySQL(不支持窗口函数)替代方案
SELECT m1.* FROM OPTIMUM.MESSAGE_ZBUS_ORAS m1 INNER JOIN ( SELECT ORDRE, ID_ADR_ORAS_CONCERNE, MAX(SENT_DATE) AS max_sent_date FROM OPTIMUM.MESSAGE_ZBUS_ORAS GROUP BY ORDRE, ID_ADR_ORAS_CONCERNE ) m2 ON m1.ORDRE = m2.ORDRE AND m1.ID_ADR_ORAS_CONCERNE = m2.ID_ADR_ORAS_CONCERNE AND m1.SENT_DATE = m2.max_sent_date ORDER BY m1.ORDRE ASC, m1.SENT_DATE ASC;
内容的提问来源于stack exchange,提问作者RMahchoum
相关产品推荐
相关产品推荐

