我们目前有一个通过我们的服务记录流量的表。我们正在寻找根据流量进行一些诊断/警报的方法,但发现在凌晨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计数。
答案 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以使其成为正确的值。
由于