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

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

原查询的问题说明

  1. 原查询的子查询中,将act.name(操作类型)加入了GROUP BY,这会让每个帖子的每一种操作类型都单独分组,取该类型下的最大日期,而非整个帖子的最后操作日期。
  2. 例如帖子1有updated和restored两种操作,原查询会生成两条记录(分别对应两种操作的最大日期),而非只保留最后一次的restored操作,最终导致统计总数虚高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:50:22