SQL Server: получить положение (порядковый номер) записи в таблице - PullRequest
3 голосов
/ 19 ноября 2010

У меня есть таблица, в которой хранится очередь задач.Каждая задача выглядит следующим образом:

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

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Запрос без предложения order by может возвращать строки в любом порядке. Какой критерий используется для упорядочивания запросов в очереди, которые не заняты или не выполнены? Это очередь FIFO? Самый старый запрос наверху? Обычно для этой цели используется значение datetime. В любом случае, я бы нумеровал строки в порядке, возвращаемом запросом во внешнем интерфейсе, где это было бы сделано намного эффективнее.

0 голосов
/ 19 ноября 2010

Если статус 0 означает «В очереди», то:

Select Count(*)
From QueuedJobs
Where Status = 0
  and Id <= @taskId

Должен сказать вам, где вы находитесь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...