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

Oracle中如何结合Group By、Order By、Having查询各ID最新交易记录

原SQL无结果原因

你写的SQL存在逻辑偏差:将ID、status、posted_by、posted_date四个字段同时作为分组依据,相当于按完整行去重,而你的示例表中所有行的四个字段组合都是唯一的,再加上HAVING COUNT(ID) > 1的过滤条件,自然没有符合要求的行返回,本身逻辑也不匹配「取每个ID最新一条记录」的需求。

正确实现方式

方式1:窗口函数法(适配MySQL8.0+、PostgreSQL、Oracle、SQL Server等主流新版本数据库)

使用ROW_NUMBER()窗口函数按ID分组,组内按日期倒序排序取第一条即可:

SELECT ID, Status, posted_date, posted_by
FROM (
    SELECT 
        ID, Status, posted_date, posted_by,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY posted_date DESC) AS row_num
    FROM MyTable
) temp
WHERE row_num = 1
ORDER BY ID DESC;

方式2:关联子查询法(兼容MySQL5.x等不支持窗口函数的低版本数据库)

先查询每个ID对应的最大日期,再关联原表匹配完整行信息:

SELECT m.ID, m.Status, m.posted_date, m.posted_by
FROM MyTable m
INNER JOIN (
    SELECT ID, MAX(posted_date) AS latest_date
    FROM MyTable
    GROUP BY ID
) latest ON m.ID = latest.ID AND m.posted_date = latest.latest_date
ORDER BY m.ID DESC;

注:如果同一个ID存在多条完全相同的posted_date记录,方式2会返回所有匹配行,如需唯一返回可额外增加排序、去重规则调整。


内容的提问来源于stack exchange,提问作者user2488578

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:03