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

sql:选择第n个位置(当多行位于第n个位置时),sql,max,Sql,Max,根据表格: 产品(id、价格) 如何编写sql查询以返回第n个最高价格的所有productus(该过程中可以有多个productus) 谢谢我不确定您使用的是哪种sql平台,但我想说的是,从 使用此结果根据价格加入初始表。这是我能做的最通用的,但在某些RDBMS使用限制的情况下,它仍然使用TOP,因此您可能需要稍微修改 SELECT * FROM Products WHERE price = ( SELECT MIN(price)

根据表格: 产品(id、价格)

如何编写sql查询以返回第n个最高价格的所有productus(该过程中可以有多个productus)


谢谢

我不确定您使用的是哪种sql平台,但我想说的是,从


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

这是我能做的最通用的,但在某些RDBMS使用限制的情况下,它仍然使用TOP,因此您可能需要稍微修改

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
          )
其他允许行数的方言可能比我的嵌套子查询提供更好的选项

编辑:键入最大值,表示最小值

编辑:有人建议我举一个使用窗口功能的例子

SELECT
  *
FROM
(
  SELECT
    RANK() OVER (ORDER BY price) AS ranked_position,
    *
  FROM
    Products
)
  AS ranked_products
WHERE
  ranked_position = 9
或者根据您想要的行为,使用密集等级

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

    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

抱歉,您必须滚动。我已经习惯了这里的格式设置。

请问什么是RDBMS和版本?知道使用哪种SQL方言非常重要……您使用的是什么版本或风格的“SQL”?每个实现都有自己的技巧…@gbn,这就是我们所说的“jinx”?它给出了所有不同价格的列表,但没有给出按顺序识别第9个值的机制。正确。正如我所说的,在不知道这是在哪个SQL平台上运行的情况下,我无法指定查找第n行的方式,因为这一行的实现差异很大。我认为最好使用select“distinct”top 9,否则您将不知道会返回什么。对吗?在本例中使用
DISTINCT
groupby
将给出相同的结果。但是,根据我的经验,
groupby
永远不会比
DISTINCT
慢,但有时会更快(取决于RDBMS)。内部查询中的ORDERBY不应该存在。但它肯定应该在所形成的行数函数调用中,这将给出第三高定价的单个项目。然而,OP要求所有价格相同的物品,如果有“平局”。
    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