Запрос за последние 10 минут, если> 300 записей ИЛИ последние 300 записей

В настоящее время у нас есть таблица, которая регистрирует трафик через наш сервис. Мы ищем способ сделать некоторые диагностические / предупреждающие сигналы на основе трафика, но обнаруживаем, что в 2 часа нам не хватает трафика, чтобы быть надежным (1 сбой в 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.

Использование последних 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()); 

Не такой аккуратный, как ваш, но:

 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 

SQL Server позволит вам использовать переменную или запрос для параметра TOP, если они заключены в круглые скобки.

Так

 SELECT (@RowCount) * FROM tbl 

работает, пока

 SELECT @RowCount * FROM tbl 

не

Благодаря StackOverflow для: Dynamic SELECT TOP @var В SQL Server я могу использовать переменную и делать if, чтобы сделать ее правильной.

благодаря

Давайте будем гением компьютера.