T-SQL按ID获取上一个每日时间戳

时间:2017-12-13 18:46:40

标签: sql-server tsql maxdate

我们有一个用户活动表。每个活动都由userID,timestamp和activityID记录。每天用户可以为每个activityID设置多行。

我们要做的是获取最后一次用户在过去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

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

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

提前感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

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

DATETIME

有必要将时间戳(可能是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 构造)转换为DATE,以便随着表的增长和覆盖多个月,您不会在两个不同月份的同一天进行分组。

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

<catch-exception-strategy **name**="400:BadRequest" when="#[message.inboundProperties['http.status']==&quot;400&quot;]" doc:name="400:BadRequest">