У меня есть таблица, в которой хранится очередь задач.Каждая задача выглядит следующим образом:
Id | Operation | Argument | Status
Операция является строкой
Аргумент представляет собой одно число
Статус имеет одно из следующих значений: Queued
, Busy
, Complete
, Failed
Мне нужно выяснить позицию элемента в очереди, но мне нужно пропустить задачи, которые не поставлены в очередь.
Пример:
1 A 5 Queued -- 1
2 A 6 Queued -- 2
3 B 3 Busy -- x
4 B 4 Complete -- x
5 A 8 Queued -- 3
Ожидаемая позиция следует --
позиция x
означает, что запрос не имеет смысла.
Вопрос: Какой хороший способ рассчитать такую позицию?
На данный момент я делаю:
SELECT TOP 1 p.Position FROM
(
SELECT Id, Status,
ROW_NUMBER() over (order by Id) as Position
from QueuedJobs where Status = 0 AND Id <= @taskId
) as p
order by Position desc
На английском языке: рассчитайте позиции каждой задачи до моей задачи и дайте мне последнюю позицию (которая является моей задачей)
Моя задача - производительность, скажем, у меня 1000 записей и много запросов(100 секунд каждую секунду).
База данных - SQL Server 2008