Ale*_*exB 3 sql t-sql sql-server
我正在使用SQLServer 2012,我有一个像这样的时间戳表:
Id INT NOT NULL, --PK
IdUser INT NOT NULL --FK from table USER
-- Some other fields
CreationDate DATETIME NOT NULL
Run Code Online (Sandbox Code Playgroud)
该表记录了用户所做的某种动作.
我试图找到IF用户做这种类型的行动20余次(即有20条与该表中的相同ID用户)在24小时内.
问题是我不是要在过去24小时内检索记录,而是在 24小时内记录(从第1个记录到今天)
这就是我写的:
SELECT IdUser
FROM MyTable
WHERE IdUser = 1
AND CreationDate BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() -- <= WRONG
Run Code Online (Sandbox Code Playgroud)
但该WHERE条款不符合我的需要,因为我不知道如何翻译" 在24小时内从用户id = 1中搜索20条记录,特别是在过去的24小时内 "
SAMPLE
假设我们的用户Id = 1做了154次此操作.所以我的表中有154条记录,记录的日期时间.
IdUser = 1 ; CreationDate = 2016-07-29 12:24:54.590
IdUser = 1 ; CreationDate = 2016-07-29 16:51:55.856
IdUser = 1 ; CreationDate = 2016-07-27 14:12:36.125
(151 omitted rows)
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是,如果我能在特定用户的24小时内找到20条记录.在这个样本中,只有2个第一次是24小时.在我的情况下,我正在寻找在此期间有20个或更多的记录.
有人可以帮助我吗?
谢谢
执行此操作(性能方面)的一种相当痛苦的方法是使用join/ group by或apply运算符.
本apply应该是从性能的角度更好:
select t.*
from t cross apply
(select count(*) as cnt
from t t2
where t2.iduser = t.iduser and
t2.creationdate >= t.creationdate and
t2.creationdate < dateadd(day, 1, t.creationdate)
) t24
where t24.cnt >= 20;
Run Code Online (Sandbox Code Playgroud)
索引(iduser, creationdate)是此查询的胜利.