1

我们有一个用户活动表。每个活动都由用户 ID、时间戳和活动 ID 记录。每天用户的每个活动ID 可以有多行。

我们要做的是获取用户在过去 X 天内最后一次执行特定活动的时间,例如以下示例:

userID   timestamp  activityID
3241    10/14/2017 7:17 2
3241    10/15/2017 8:17 2
3241    10/16/2017 8:17 2
4355    10/15/2017 8:17 2
4355    10/16/2017 8:17 2
4355    10/17/2017 8:17 2
1234    10/15/2017 8:17 2
2236    10/15/2017 8:17 2
2236    10/16/2017 8:17 2
2002    10/17/2017 8:17 2

我可以提取用户 ID 执行的最后一次活动,但不能提取过去 X 天内的每一天:

select t1.[userID], 
       t2.[mxdate]
from TableA t1
inner join
(
  select max([timestamp]) AS mxdate, 
         [userID]
    from TableA
    where activityType = 2
group by [userID]
) t2
  on t1.[userID] = t2.[userID]
  and t1.[timestamp] = t2.mxdate

我一直在尝试各种方法来按时间戳的日期部分分组,但到目前为止还没有成功。我不断获得每一个活动和时间戳。

我是否至少朝着正确的方向前进?如果是这样,我错过了什么/条款?

提前感谢您的任何帮助!

4

1 回答 1

0

通过按时间戳的 DATE 部分进行分组,您可以获得每个活动的最大时间戳:

;WITH cte ( userid, [day], activityid, [timestamp] ) AS (
    SELECT t.userid, [day] = CONVERT(NVARCHAR, t.timestamp, 101), t.activityid, MAX(t.timestamp)
      FROM MyTable t
     GROUP BY t.userid, CONVERT(NVARCHAR, t.timestamp, 101), t.activityid
)
SELECT *
  FROM cte
 WHERE cte.activityid = 2

有必要将时间戳(可能是一个DATETIME构造)转换为 DATE,以便随着表的增长并涵盖多个月份,您不会在两个不同月份的同一天分组。

在单个查询中使用派生表:

SELECT t.userid, t.activityid, t.timestamp
  FROM (SELECT i.userid, i.activityid, maxTS = MAX(i.timestamp)
          FROM MyTable i
         GROUP BY i.userid, i.activityid, CONVERT(DATE, i.timestamp)) maxRows
         INNER JOIN MyTable t
           ON maxRows.userid = t.userid
          AND maxRows.activityid = t.activityid
          AND maxRows.maxTS = t.timestamp
 WHERE t.activity = 2
于 2017-12-13T19:23:37.080 回答