Как определить, что две записи разнесены на 1 год (используя временную метку) - PullRequest
1 голос
/ 05 марта 2012

Мне нужно проанализировать некоторые блоги и определить, посетил ли пользователь один раз, взял ли он годовой перерыв и посетил ли он снова. Я хочу добавить флаг к каждой строке (Y / N) с визитом, который соответствует вышеуказанным критериям.

Как мне создать этот sql?

Вот поля, которые у меня есть, и которые, я думаю, необходимо использовать (анализируя временную метку первой страницы каждого посещения):

  • VisitID - каждый визит имеет уникальный идентификатор (т. Е. 12356, 12345, 16459)
  • UserID - у каждого пользователя есть один Id (т. Е. Steve = 1, ted = 2, mark = 12345 и т. Д.)
  • TimeStamp - выглядит так: 2010-01-01 00: 32: 30.000

select VisitID, UserID, TimeStamp from page_view_t where pageNum = 1;

спасибо - любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 05 марта 2012

Вы можете ранжировать строки каждого пользователя, а затем соединять ранжированные строки, установленные для себя, для сравнения соседних строк:

;
WITH ranked AS (
  SELECT
    *,
    rnk = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY TimeStamp)
  FROM page_view_t
),
flagged AS (
  SELECT
    *,
    IsReturnVisit = CASE
      WHEN EXISTS (
        SELECT *
        FROM ranked
        WHERE UserID = r.UserID
          AND rnk = r.rnk - 1
          AND TimeStamp <= DATEADD(YEAR, -1, r.TimeStamp)
      )
      THEN 'Y'
      ELSE 'N'
    END
  FROM ranked r
)
SELECT
  VisitID,
  UserID,
  TimeStamp,
  IsReturnVisit
FROM flagged

Примечание: указанные выше флаги только возвращают посещения.

ОБНОВЛЕНИЕ

Чтобы пометить первые посещения так же, как и повторные посещения, flagged CTE можно изменить следующим образом:

…
SELECT
  *,
  IsFirstOrReturnVisit = CASE
    WHEN p.UserID IS NULL OR r.TimeStamp >= DATEADD(YEAR, 1, p.TimeStamp)
    THEN 'Y'
    ELSE 'N'
  END
FROM ranked r
  LEFT JOIN ranked p ON r.UserID = p.UserID AND r.rnk = p.rnk + 1
…

Ссылки, которые могут быть полезны:

1 голос
/ 05 марта 2012

Предполагая, что в таблице page_view_t хранятся данные UserID и TimeStamp для каждого посещения пользователя, следующий запрос вернет пользователей, которые посетили, с перерывом не менее года (365 дней) между двумя последовательными посещениями.

select t1.UserID
from page_view_t t1
where (
    select datediff(day, max(t2.[TimeStamp]), t1.[TimeStamp])
    from page_view_t t2
    where t2.UserID = t1.UserID and t2.[TimeStamp] < t1.[TimeStamp]
    group by t2.UserID
) >= 365
1 голос
/ 05 марта 2012

Другой парень был быстрее, но так как я потратил время на это, и это совершенно другой подход, я мог бы также опубликовать его: D.

SELECT pv2.VisitID,
       pv2.UserID,  
       pv2.TimeStamp, 
       CASE WHEN pv1.VisitID IS NOT NULL 
             AND pv3.VisitID IS NULL
       THEN 'YES' ELSE 'NO' END AS IsReturnVisit
FROM page_view_t pv2
LEFT JOIN page_view_t pv1 ON pv1.UserID = pv2.UserID
                          AND pv1.VisitID <> pv2.VisitID
                          AND (pv1.TimeStamp <= DATEADD(YEAR, -1, pv2.TimeStamp)
                               OR pv2.TimeStamp <= DATEADD(YEAR, -1, pv1.TimeStamp))
                          AND pv1.pageNum = 1
LEFT JOIN page_view_t pv3 ON pv1.UserID = pv3.UserID
                          AND (pv3.TimeStamp BETWEEN pv1.TimeStamp AND pv2.TimeStamp
                               OR pv3.TimeStamp BETWEEN pv2.TimeStamp AND pv1.TimeStamp)
                          AND pv3.pageNum = 1
WHERE pv2.pageNum = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...