【发布时间】:2019-02-19 15:20:41
【问题描述】:
我想知道某个用户在特定秒数(例如 10 秒)内存在多少行。所以,鉴于这些数据:
UserId CreatedDate
4.........2017-01-11 01:40:19:077
4.........2017-01-11 01:40:19:437
4.........2017-01-11 01:40:20:077
4.........2017-01-11 01:50:19:077
4.........2017-01-11 02:40:19:077
4.........2017-01-11 02:40:19:437
4.........2017-01-11 02:40:20:077
4.........2017-01-11 02:40:20:437
4.........2017-01-11 02:40:21:077
4.........2017-01-11 02:40:22:077
4.........2017-01-11 02:40:23:077
4.........2017-01-11 03:15:19:077
4.........2017-01-11 03:40:19:077
4.........2017-01-11 04:40:19:077
前三行将组合在一起,第 5-11 行将组合在一起(因为它们都在 10 秒内)。
我尝试了类似的方法,但这只给了我两个一组的行。我想知道 10 秒范围内的所有行。
;WITH CTE AS
(
SELECT UserId
,CreatedDate
,ISNULL(LAG(CreatedDate) OVER (Partition BY UserId ORDER BY CreatedDate), '1/1/2000') AS PriorCreatedDate
FROM Foo
)
SELECT *
FROM CTE
WHERE DATEDIFF(SECOND,PriorCreatedDate,CreatedDate) <= 1
ORDER BY UserId, CreatedDate
这可能吗?
【问题讨论】:
-
“都在 10 秒之内”到底是什么意思?如果一行有他的值
2017-01-11 01:50:00,它会在第一组吗? -
第一组大约是 1:40,所以不,那是 10 分钟后。它也不适合 1:50:19,因为那是 19 秒后。
-
是将每个用户的个人活动分解为它自己的前:10 秒间隔,或全部基于 SAME Master 10 秒基础。完全不同的结果
-
10 秒间隔是全局的。
-
@BobHorn 。 . .正如您所指定的问题,这需要递归 CTE - 这相当昂贵。
标签: sql sql-server date sql-server-2014