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
相关产品推荐
相关产品推荐

