我使用的是SQLServer 2012,我有一个这样的表时间戳:
Id INT NOT NULL, --PK
IdUser INT NOT NULL --FK from table USER
-- Some other fields
CreationDate DATETIME NOT NULL
此表记录用户所做的某种类型的操作。
如果用户在24小时内执行这种操作超过20次(即该表中有20条具有相同IdUser的记录),我将尝试查找。
问题是,我不是试图在过去24小时内检索记录,而是在24小时内(从第一次记录到今天)记录
我就是这么写的:
SELECT IdUser
FROM MyTable
WHERE IdUser = 1
AND CreationDate BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() -- <= WRONG
但是WHERE
子句不符合我的需要,因为我不知道如何在24小时内从用户id=1中寻找20条记录,特别是最后的24小时。
样本
假设我们的用户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)
我正在寻找的是,如果我能在24小时内为一个特定的用户找到20条记录。在这个样本中,只有两个第一在24小时内。在我的例子中,我在寻找这段时间内是否有20或更多的记录。
有人能帮我吗?
谢谢
发布于 2016-07-29 05:45:24
一种非常痛苦的方法(从性能上讲)是使用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;
(iduser, creationdate)
上的索引是此查询的胜利。
发布于 2016-07-29 05:55:02
您是否尝试声明一个DateTime变量并设置要查询的日期??
另外,如果你只想要'n‘记录,你可以使用'n’子句。甚至,您也可以使用TOP n%来获得百分比。(顺便说一句,TOP从SQLServer 2008开始就有了)
DECLARE @DATE DATETIME = '20160601' --YYYYMMDD
SELECT TOP 20 IdUser
FROM MyTable
WHERE IdUser = 1
AND CreationDate BETWEEN DATEADD(day, -1, @DATE) AND @DATE
发布于 2016-07-29 05:55:58
您可以根据需要传递@starttime的值。
DECLARE @starttime DATETIME SELECT IdUser FROM MyTable WHERE CreationDate BETWEEN @starttime and DATEADD(HOUR, 24, @starttime) GROUP BY IdUser HAVING COUNT(CreationDate) > 20
https://stackoverflow.com/questions/38659903
复制相似问题