Sql Query查找彼此在5分钟内发生的一系列日期?

时间:2009-09-22 12:40:49

标签: sql-server

这是Sql Server 2008.我有一组看起来像这样的数据:

Table UserAchievement
   id
   userId
   achievementId
   completedDate

当用户获得奖励时,奖励和用户会被记录日期。我想要的是一个查询,它可以找到同一个用户在5分钟内获得的3个成就。有关如何实现这一点的任何想法?

提前致谢 -

2 个答案:

答案 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分钟内。