查找在24小时内创建的记录(尤其是最近24小时)

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个或更多的记录.

有人可以帮助我吗?
谢谢

Gor*_*off 6

执行此操作(性能方面)的一种相当痛苦的方法是使用join/ group byapply运算符.

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)是此查询的胜利.