Выбор ограниченного числа строк выполняется по-разному в разных разновидностях SQL, поэтому в зависимости от того, что вы используете, может быть встроенный способ сделать это. Например, в MS SQL Server:
SELECT TOP 1
identifier,
priority_number,
timestamp,
description
FROM
dbo.Queue_Manager
ORDER BY
priority_number,
timestamp
Для этого в ANSI-совместимом SQL должны работать следующие методы:
SELECT
QM1.identifier,
QM1.priority_number,
QM1.timestamp,
QM1.description
FROM
Queue_Manager QM1
LEFT OUTER JOIN Queue_Manager QM2 ON
QM2.priority_number < QM1.priority_number OR
(QM2.priority_number = QM1.priority_number AND QM2.timestamp < QM1.timestamp)
/* If you're concerned that there might be an exact match by priority_number
and timestamp then you might want to add a bit more to the join */
WHERE
QM2.identifier IS NULL
Или вы можете попробовать:
SELECT
QM1.identifier,
QM1.priority_number,
QM1.timestamp,
QM1.description
FROM
Queue_Manager QM1
INNER JOIN
(
SELECT
priority_number
MIN(timestamp) AS timestamp,
FROM
Queue_Manager
WHERE
priority_number =
(
SELECT
MIN(priority_number)
FROM
Queue_Manager
)
GROUP BY
priority_number
) SQ1 ON
SQ1.priority_number = QM1.priority_number AND
SQ1.timestamp = QM1.timestamp
Ни один из методов не учитывает точные совпадения в обоих значениях priority_number и timestamp, поэтому, если вы считаете, что это возможно (и, возможно, даже если вы этого не сделаете), вам нужно добавить одну или две строки, чтобы перейти на еще один уровень с использованием идентификатора или что-то еще, что гарантирует уникальность. Или просто напишите свой интерфейс, чтобы обработать случайный случай возврата двух строк (возможно, просто проигнорируйте второй - вы получите его в следующий раз).
Протестируйте каждый метод и посмотрите, какой из них лучше для вас.
Кроме того, какого размера вы ожидаете получить очередь? Было бы разумно просто запросить с помощью ORDER BY, и только внешний интерфейс получит первую строку.