这是Sql Server 2008.我有一组看起来像这样的数据:
Table UserAchievement
id
userId
achievementId
completedDate
当用户获得奖励时,奖励和用户会被记录日期。我想要的是一个查询,它可以找到同一个用户在5分钟内获得的3个成就。有关如何实现这一点的任何想法?
提前致谢 -
储
答案 0 :(得分:4)
我的博客中的这篇文章更详细地解释了解决方案:
SELECT *
FROM UserArchievement uf
WHERE EXISTS
(
SELECT NULL
FROM UserArchievement un
WHERE un.userId = uf.userID
AND un.completedDate BETWEEN DATEADD(minute, -5, uf.completedDate) AND DATEADD(minute, 5, uf.completedDate)
AND un.id <> uf.id
)
如果您想在N
分钟内选择所有5
个奖项,请使用此选项:
SELECT DISTINCT ue.id
FROM UserArchievement uf
JOIN UserArchievement ue
ON ue.userID = uf.userID
AND ue.completedDate BETWEEN uf.completedDate AND DATEADD(minute, 5, uf.completedDate)
WHERE (
SELECT COUNT(*)
FROM UserArchievement un
WHERE un.userId = uf.userID
AND un.completedDate BETWEEN uf.completedDate AND DATEADD(minute, 5, uf.completedDate)
) = 3
将3
替换为您需要的任意数量的奖励。
答案 1 :(得分:1)
好的,我明白了 -
我将3个表连接回主表,每次使用between函数以确保新连接的表在原始时间的5分钟内。