Sql Запрос найти серию дат, которые происходят в течение 5 минут друг от друга? - PullRequest
1 голос
/ 22 сентября 2009

Это Sql Server 2008. У меня есть набор данных, который выглядит примерно так:

Table UserAchievement
   id
   userId
   achievementId
   completedDate

Когда пользователь получает награду, награда и пользователь регистрируются вместе с датой. То, что я хотел бы, это запрос, который находит набор из 3 достижений, которые были получены в течение 5 минут друг от друга одним и тем же пользователем. Есть мысли о том, как этого добиться?

Заранее спасибо -

Чу

Ответы [ 2 ]

4 голосов
/ 22 сентября 2009

Эта статья в моем блоге объясняет решение более подробно:


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 голос
/ 22 сентября 2009

ОК, я понял -

Я присоединил 3 таблицы к своей основной таблице, каждый раз используя функцию между ними, чтобы убедиться, что вновь объединенная таблица была в пределах 5 минут от исходного времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...