T-SQL 通过 ID 获取最后一天的时间戳
T-SQL Get last daily timestamp by ID
我们有 table 的用户活动。每个 activity 都按用户 ID、时间戳和 activityID 记录。每个用户每天的每个 activityID 可以有多行。
我们想要做的是获取用户在过去 X 天内最后一次执行特定 activity 的时间,例如这个例子:
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
我可以提取 上次 activity 是由用户 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
我一直在尝试各种方法来 GROUP BY 时间戳的日期部分,但到目前为止还没有成功。我一直在获取每个 activity 和它的时间戳。
至少我的方向是正确的吗?如果是这样,我缺少什么 piece/clause?
在此先感谢您的帮助!
通过按时间戳的 DATE 部分分组,您可以获得每个 activity:
的最大时间戳
;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,以便随着 table 增长并涵盖多个月份,您不会在同一天分成两部分不同的月份。
在单个查询中使用派生的 table:
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
我们有 table 的用户活动。每个 activity 都按用户 ID、时间戳和 activityID 记录。每个用户每天的每个 activityID 可以有多行。
我们想要做的是获取用户在过去 X 天内最后一次执行特定 activity 的时间,例如这个例子:
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
我可以提取 上次 activity 是由用户 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
我一直在尝试各种方法来 GROUP BY 时间戳的日期部分,但到目前为止还没有成功。我一直在获取每个 activity 和它的时间戳。
至少我的方向是正确的吗?如果是这样,我缺少什么 piece/clause?
在此先感谢您的帮助!
通过按时间戳的 DATE 部分分组,您可以获得每个 activity:
的最大时间戳;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,以便随着 table 增长并涵盖多个月份,您不会在同一天分成两部分不同的月份。
在单个查询中使用派生的 table:
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