sql:选择第n个位置(当多行位于第n位时)

时间:2011-06-17 13:52:40

标签: sql max

鉴于此表: 产品(id,价格)

如何编写SQL查询以返回所有具有第N个最高价格的产品(可以使用该过程多于一个)

由于

3 个答案:

答案 0 :(得分:2)

这是我可以做到的最通用的,但它仍然使用TOP,其中一些RDBMS使用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,具体取决于您想要的行为。

注意:检查您的RDBMS是否使用了窗口函数。并非所有人都是平等的。

答案 1 :(得分:1)

我不确定你使用的是哪个sql平台,但是我会说第n行(实现这个因sql平台而异)来自

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

根据价格使用此结果加入您的初始表。

答案 2 :(得分:0)

    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

抱歉,你必须滚动。我习惯了格式化。