You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:45:07