Это наиболее общий вариант, который я могу сделать, но он по-прежнему использует TOP, где некоторые СУБД используют LIMIT, поэтому вам может потребоваться внести небольшие изменения.
SELECT
*
FROM
Products
WHERE
price = (
SELECT
MIN(price)
FROM
(
SELECT TOP 9 price FROM Products GROUP BY price ORDER BY price DESC
)
AS top_9
)
Другие диалекты, которые позволяют row_number, вероятно, будут иметь лучшие параметры, чем мои вложенные подзапросы.
РЕДАКТИРОВАТЬ : типизированный MAX, означает MIN
РЕДАКТИРОВАТЬ : Кто-то предложил мне привести пример использования оконных функций ...
SELECT
*
FROM
(
SELECT
RANK() OVER (ORDER BY price) AS ranked_position,
*
FROM
Products
)
AS ranked_products
WHERE
ranked_position = 9
Или используйте DENSE_RANK, в зависимости от желаемого поведения.
Примечание. Проверьте свою СУБД на предмет использования оконных функций. Не все созданы равными.