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

