SQL分组查询遇ORA-00979错误及统计结果不符问题求助
问题分析与解决方案
你的核心问题是没有先筛选出每个帖子的最后一次操作记录,反而在子查询中把操作类型也加入了分组条件,导致一个帖子的所有符合条件的操作类型都被单独统计,而非只保留最后一次操作。
正确的查询语句
WITH latest_post_actions AS ( -- 第一步:获取用户1的每个帖子的最后操作日期 SELECT ac.post_id, MAX(ac.date) AS last_action_date FROM ACTION ac JOIN POST p ON ac.post_id = p.id WHERE p.user_id = 1 GROUP BY ac.post_id ) -- 第二步:关联回各表,获取最后操作的类型并统计 SELECT act.name AS actions, u.name AS user_name, COUNT(*) AS cnt FROM latest_post_actions la JOIN ACTION ac ON la.post_id = ac.post_id AND la.last_action_date = ac.date JOIN ACTION_TYPE act ON ac.action_type_id = act.id JOIN POST p ON la.post_id = p.id JOIN "USER" u ON p.user_id = u.id -- USER是Oracle关键字,建议用双引号包裹 WHERE act.name IN ('restored','deleted','updated') GROUP BY act.name, u.name;
结果验证
执行后会得到你期望的结果:
actions user_name cnt ---------- ---------- ----------- updated ERIC 2 deleted ERIC 1 restored ERIC 1
原查询的问题说明
- 原查询的子查询中,将
act.name(操作类型)加入了GROUP BY,这会让每个帖子的每一种操作类型都单独分组,取该类型下的最大日期,而非整个帖子的最后操作日期。 - 例如帖子1有
updated和restored两种操作,原查询会生成两条记录(分别对应两种操作的最大日期),而非只保留最后一次的restored操作,最终导致统计总数虚高。
内容的提问来源于stack exchange,提问作者studentcoding
相关产品推荐
相关产品推荐

