如果>查询最后10分钟300条记录或最近300条记录

时间:2013-11-06 18:59:17

标签: sql sql-server

我们目前有一个通过我们的服务记录流量的表。我们正在寻找根据流量进行一些诊断/警报的方法,但发现在凌晨2点我们没有足够的流量可靠(1点在凌晨2点失败可能是50%的失败率,但是在上午9点,当人们工作时,1次失败可能是.01%)。

我们要在最后10分钟通过服务器查看,如果最后10分钟没有300条记录,我们想要回去,直到我们有300条记录。

有没有办法在查询中执行此操作?

我们的表格如下:

ID INT,
ServerID INT,
Success BIT,
ActionDate DATETIME

我可以使用ROW_NUMBER()来获取最后300个,但如果流量足够高,这不是最后10分钟,我们就会丢失可能相关的数据。< / p>

我希望按照

的方式做点什么
SET _RowCount = SELECT COUNT(*) FROM tbl WHERE Date >= DATEADD(M, -10, GETDATE()); 
IF _RowCount < 300 SET @RowCount = 300;  
SELECT TOP _RowCount records

但似乎无法使用变量作为TOP计数。

3 个答案:

答案 0 :(得分:2)

使用最后300条记录似乎是最简单的事情:

SELECT top 300 t.*
FROM tbl t
order by date desc;

但是你可以用一个查询做你想做的事情:

select t.*
from (select t.*, row_number() over (order by date desc) as seqnum
      from tbl t
     ) t
where seqnum <= 300 or Date >= DATEADD(M, -10, GETDATE());

答案 1 :(得分:0)

不像你的那样整洁,但是:

SET @RowCount = SELECT COUNT(*) FROM tbl WHERE Date >= DATEADD(M, -10, GETDATE()); 

IF @RowCount < 300 
BEGIN
  SELECT TOP 300 records order by Date Desc
END
ELSE
  SELECT records WHERE Date >= DATEADD(M, -10, GETDATE())
END

答案 2 :(得分:0)

如果括在括号中,SQL Server将允许您对TOP参数使用变量或查询。

所以

SELECT (@RowCount) * FROM tbl

工作时

SELECT @RowCount * FROM tbl

没有

感谢StackOverflow:Dynamic SELECT TOP @var In SQL Server我可以使用变量并执行if以使其成为正确的值。

由于