基于同表数据的SQL计算:求两日期均存在的用户value差值
解决方案:筛选双日期用户并计算Value差值
嘿,我来帮你搞定这个SQL需求!要筛选出在2018-03-20和2018-03-22两个日期都出现的用户,还要计算他们后日期与前日期的value差值,这里有两种实用的实现方式:
方法1:自连接(JOIN)
这种方法逻辑直观,通过将表自身按用户名称关联,精准匹配两个日期的记录来计算差值:
SELECT t1.Name, t2.value - t1.value AS value_diff FROM your_table t1 JOIN your_table t2 ON t1.Name = t2.Name WHERE t1.date = '2018-03-20' AND t2.date = '2018-03-22';
简单说明:
- 用
t1指代用户在2018-03-20的记录,t2指代同一用户在2018-03-22的记录 JOIN会自动过滤掉只在单个日期出现的用户- 直接通过
t2.value - t1.value得到两次value的差值
方法2:条件聚合(CASE WHEN + GROUP BY)
如果后续需要扩展处理更多日期或聚合其他字段,这种方法会更灵活:
SELECT Name, MAX(CASE WHEN date = '2018-03-22' THEN value END) - MAX(CASE WHEN date = '2018-03-20' THEN value END) AS value_diff FROM your_table WHERE date IN ('2018-03-20', '2018-03-22') GROUP BY Name HAVING COUNT(DISTINCT date) = 2; -- 确保用户在两个日期都有有效记录
简单说明:
- 先筛选出目标两个日期的所有数据
- 按用户
Name分组后,用CASE WHEN分别提取两个日期的value值 HAVING子句会过滤掉仅在单个日期出现的用户- 最后计算两个日期value的差值
验证结果
两种方法执行后都会得到你需要的结果:
Mr.A,10
Mr.B,11
Mr.C,13
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

