【发布时间】:2014-10-10 02:43:41
【问题描述】:
我有一个由用户、练习和分数组成的表格。下面可以看到表格的结构和一些示例数据(仅供参考)。
|UserID | ExerciseID | Score |------------------------------|1 | 1 | 0 ||1 | 2 | 1 ||2 | 1 | 1 ||2 | 2 | 0 |
此表包含大约 92000 个评分(每行是唯一的三个)。我希望收到该表的一个子集,其中包含最活跃的用户和练习。最活跃意味着例如在表中出现超过 20 次。所以我希望用户完成了超过 20 次不同的练习,并且我希望不同的用户完成了超过 20 次的练习。
有点循环推理,因为我希望用户完成了 20 个或更多不同的活动练习,这些练习必须是活动的,因为它们应该由 20 个或更多用户完成,并且那些用户应该是活跃的等等等等..
我希望这可以通过查询来实现,我已经尝试过自己并提出了一个接近我想要的结果的查询,但结果并不完全准确(因为有一个用户只完成了16 个练习和 2 个已被其他用户完成 19 次的练习)。查询有点难看,但它是:
select UserID, ExerciseID, Score
from [FrenchExercises]
where ExerciseID in ( select ExerciseID
from [FrenchExercises]
where UserID in (SELECT UserID
FROM [FrenchExercises]
GROUP BY UserID
HAVING count(ExerciseID) >= 20)
group by ExerciseID
having count(UserID) >= 20)
AND UserID in ( select UserID
from [FrenchExercises]
where ExerciseIDin (SELECT ExerciseID
FROM [FrenchExercises]
GROUP BY ExerciseID
HAVING count(UserID) >= 20)
group by UserID
having count(ExerciseID) >= 20)
第一个子查询选择最活跃的用户,然后从活跃用户列表中选择最活跃的用户练习。第二个查询从锻炼的角度做同样的事情,它选择最活跃的锻炼,然后选择选择了这些锻炼的最活跃的用户。当我想组合这两个查询并选择ExerciseID、UserID 和Score 时,我发现结果并不完全正确。
我猜我的查询有一些错误,或者我采取了完全错误的方法。任何想法将不胜感激。
【问题讨论】:
-
为什么不只是
select UserID, count(distinct ExerciseID) as exercises from [FrenchExercises] group by UserID和select ExerciseID, count(distinct UserID) as users from [FrenchExercises] group by ExerciseID -
@juergend - 他不想要单独的结果。他希望查询显示回答了最“活跃”问题的最活跃用户。所以,这不是一个简单的答案。
-
这听起来像是协同集群,在 SQL Server 中会有点棘手。
-
@juergend Borat Sagdiyev 是对的,我不想要单独的结果。 Gordon Linoff,关于如何在 SQL Server 中处理的任何想法?还是用不同的方法解决更好?
-
什么是“活跃用户”?有做过20+练习的用户吗?
标签: sql sql-server select count having