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

MySQL子查询返回多行问题:计算用户Act1的5日数值差值

解决SQL子查询返回多行错误并计算用户Act1差值

原SQL报错的核心原因是两个子查询未关联当前分组的Username,导致返回所有用户的Act1记录,违反了子查询只能返回单行的要求。下面提供两种可行的解决方案:

方法一:条件聚合(推荐)

通过CASE语句筛选今日和5日前的Act1数值,直接计算差值:

SELECT
    Username AS USERS,
    MAX(CASE WHEN DATE_FORMAT(Date, '%Y-%m-%d') = CURRENT_DATE() AND Activity = 'Act1' THEN Value ELSE NULL END)
    - MAX(CASE WHEN DATE_FORMAT(Date, '%Y-%m-%d') = DATE_SUB(CURRENT_DATE(), INTERVAL 5 DAY) AND Activity = 'Act1' THEN Value ELSE NULL END)
    AS DIFFERENCE_ACTIVITY1_5_DAYS
FROM table1
GROUP BY Username
HAVING DIFFERENCE_ACTIVITY1_5_DAYS IS NOT NULL; -- 可选:仅保留有完整数据的用户
  • 用MAX()聚合是因为每个用户每日每个活动仅存一条记录,取最大值等价于取唯一值
  • CURRENT_DATE()比NOW()更适合日期比较,它仅返回日期部分
  • 末尾HAVING子句可过滤掉缺少今日或5日前Act1数据的用户,按需使用

方法二:自连接

将表与自身连接,匹配同一用户今日和5日前的Act1记录:

SELECT
    t1.Username AS USERS,
    t1.Value - t5.Value AS DIFFERENCE_ACTIVITY1_5_DAYS
FROM table1 t1
JOIN table1 t5
    ON t1.Username = t5.Username
    AND t1.Activity = 'Act1'
    AND t5.Activity = 'Act1'
    AND DATE_FORMAT(t1.Date, '%Y-%m-%d') = CURRENT_DATE()
    AND DATE_FORMAT(t5.Date, '%Y-%m-%d') = DATE_SUB(CURRENT_DATE(), INTERVAL 5 DAY);
  • 自连接通过Username关联同一用户的两条目标记录
  • 这种方式仅返回同时存在今日和5日前Act1数据的用户

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:42:24