2

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

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

有没有办法在查询中做到这一点?

我们的表格如下所示:

ID INT,
ServerID INT,
Success BIT,
ActionDate DATETIME

我可以ROW_NUMBER()用来获取最后 300 分钟,但如果流量足够高以至于这不是最后 10 分钟的完整时间,我们就会丢失可能相关的数据。

我正在寻找按照以下方式做的事情

SET _RowCount = SELECT COUNT(*) FROM tbl WHERE Date >= DATEADD(M, -10, GETDATE()); 
IF _RowCount < 300 SET @RowCount = 300;  
SELECT TOP _RowCount records

但似乎不能使用变量作为 TOP 计数。

4

3 回答 3

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());
于 2013-11-06T19:17:30.137 回答
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
于 2013-11-06T19:17:36.787 回答
0

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

所以

SELECT (@RowCount) * FROM tbl

工作时

SELECT @RowCount * FROM tbl

才不是

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

谢谢

于 2013-11-06T19:19:42.837 回答