以下ERD
assessment
表示用户完成的测试。每项评估都包含许多项目,level
表示每项评分。
我需要计算用户在最早和最新评估中的平均得分之间的差异,但我真的很挣扎。
我可以用
获得每次评估的平均分数SELECT a.user_id,
a.date_created,
avg(ai.level)
FROM assessment a
JOIN assessment_item ai ON a.id = ai.assessment_id
GROUP BY a.user_id, a.date_created
ORDER BY 1;
此查询返回
等数据user_id, date_created, avg_score
10, "2015-07-13 18:09:59", 3.0000
11, "2015-07-13 18:09:59", 3.0000
13, "2015-07-13 18:26:00", 2.0000
13, "2015-07-13 18:27:28", 6.0000
13, "2015-07-13 19:04:58", 3.0000
我可以(以编程方式)迭代此查询返回的结果,忽略任何“中间”评估或仅完成一次评估的用户的结果,但我认为应该有一种方法来改进查询,使数据成为可能回报更接近我的需要。
答案 0 :(得分:0)
EXISTS
救援! (第一个记录没有以前的记录;最后一个记录没有下一个记录;退出产生一个布尔值,可以比较)
[未经测试,因为我没有测试数据]
SELECT a.user_id
, a.date_created
, avg(ai.level)
FROM assessment a
JOIN assessment_item ai ON a.id = ai.assessment_id
WHERE EXISTS ( SELECT * FROM assessment xx
WHERE xx.user_id = a.userid
AND xx.date_created < a.date_created
)
<> EXISTS ( SELECT * FROM assessment xx
WHERE xx.user_id = a.userid
AND xx.date_created > a.date_created
)
GROUP BY a.user_id, a.date_created
ORDER BY 1, 2;