sql: выбор n-го места (когда несколько строк находятся на n-м месте) - PullRequest
1 голос
/ 17 июня 2011

С учетом таблицы: Продукты (id, цена)

Как мне написать SQL-запрос, чтобы вернуть все продукты с N-й наивысшей ценой (может быть больше, чем один с этой процедурой)

Спасибо

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Это наиболее общий вариант, который я могу сделать, но он по-прежнему использует 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, в зависимости от желаемого поведения.

Примечание. Проверьте свою СУБД на предмет использования оконных функций. Не все созданы равными.

1 голос
/ 17 июня 2011

Я не уверен, какую платформу sql вы используете, но я бы сказал, получить n-ю строку (реализация зависит от платформы sql) от

SELECT DISTINCT price FROM myDB.myTable ORDER BY price DESC;

Используйте результаты этого, чтобы присоединиться к вашей исходной таблице на основе цены.

0 голосов
/ 17 июня 2011
    SELECT * FROM
    (SELECT DISTINCT price, ROW_NUMBER() OVER(ORDER BY price DESC) AS priceN FROM myDB.myTable) X 
    WHERE priceN=3

отформатированный код ... новинка для этого.

Как проверить на связывание ... редактирование на основе комментария ...

    SELECT * FROM
    (SELECT price,COUNT(price) AS PriceCount, ROW_NUMBER() OVER(ORDER BY price DESC) AS priceN FROM myDB.myTable GROUP BY PRICE HAVING COUNT(price) > 1) X 
    WHERE priceN=3

Извините, вы должныпрокрутки.Я привыкаю к ​​форматированию здесь.

...