包括查询结果中的第一个和最后一个组

时间:2015-07-14 13:05:45

标签: mysql sql

以下ERD

enter image description here

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

我可以(以编程方式)迭代此查询返回的结果,忽略任何“中间”评估或仅完成一次评估的用户的结果,但我认为应该有一种方法来改进查询,使数据成为可能回报更接近我的需要。

1 个答案:

答案 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;