【问题标题】:Sql Query to find A series of dates that occur within 5 minutes of each other?Sql Query 查找彼此相隔 5 分钟内发生的一系列日期?
【发布时间】:2020-06-18 14:57:43
【问题描述】:

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

Table UserAchievement
   id
   userId
   achievementId
   completedDate

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

提前致谢-

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    我博客中的这篇文章更详细地解释了解决方案:


    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
            )
    

    如果您想在5 分钟内选择所有N 奖项,请使用:

    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替换为您需要的任意数量的奖励。

    【讨论】:

      【解决方案2】:

      好的,我明白了 -

      我将 3 个表加入到我的主表中,每次都使用 between 函数确保新加入的表在原始时间的 5 分钟内。

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多