【问题标题】:SQL. Is there any efficient way to find second lowest value?SQL。有没有什么有效的方法可以找到第二低的值?
【发布时间】:2013-06-08 00:47:19
【问题描述】:

我有下表:

 ItemID Price
    1   10
    2   20
    3   12
    4   10
    5   11

我需要找到第二低的价格。到目前为止,我有一个有效的查询,但我不确定它是否是最有效的查询:

select min(price)
from table
where itemid not in
(select itemid
from table
where price=
(select min(price)
from table));

如果我必须找到第三或第四个最低价格怎么办?我什至没有提到其他属性和条件......有没有更有效的方法来做到这一点?

PS:请注意,最小值不是唯一值。例如,第 1 项和第 4 项都是最小值。简单的订购是不行的。

【问题讨论】:

    标签: sql db2 subquery


    【解决方案1】:
    SELECT MIN( price )
    FROM table
    WHERE price > ( SELECT MIN( price )
                    FROM table )
    

    【讨论】:

      【解决方案2】:
      select price from table where price in (
          select 
              distinct price 
          from 
          (select t.price,rownumber() over () as rownum from table t) as x 
          where x.rownum = 2 --or 3, 4, 5, etc
      )
      

      【讨论】:

      • 它可能有效,但不一定是第 2 行。可能有两个最小值,如上 ItemID=1 和 4 都有 10
      • @Buras 以上怎么样?如果它不起作用,我深表歉意,我没有 db2 实例来测试它。
      • @TomStudee 我相信函数拼写为 row_number()。
      • @Buras 在不同值的中间结果集上使用 row_number(),在最里面的 SELECT 中不能有重复值。最外面的 SELECT 看起来是多余的,因为它显示重复的价格,但没有任何内容。但是,在其他示例中,您可能会考虑使用 dense_rank(),因为如果它们并列第二位,它将识别多行。 rank() 函数略有不同,在这里可能没有用,因为如果有绑定的值,那么排名数字将被跳过。在并列第一名的情况下,rank() 将跳过第二名,但 dense_rank() 不会跳过第二名。
      【解决方案3】:

      不确定这是否是最快的,但它会更容易选择第二个、第三个等...只需更改 TOP 值。

      更新

      SELECT MIN(price)
      FROM table
      WHERE price NOT IN (SELECT DISTINCT TOP 1 price FROM table ORDER BY price)
      

      【讨论】:

      • 这是一个很好的解决方案,但可能有两个最小值,并且不起作用
      • TOP 在 DB2 中不可用
      【解决方案4】:

      要找出员工的第二最低工资,您可以使用以下方法:

      select min(salary) 
      from table 
      where salary > (select min(salary) from table);
      

      【讨论】:

        【解决方案5】:

        我想最简单的方法是使用标准 sql 中的 offset-fetch 过滤器,如果您的列中没有重复值,则不需要 distinct。

        select distinct(price) from table order by price offset 1 row fetch first 1 row only;

        无需编写复杂的子查询....

        在 amazon redshift 中,使用 limit-fetch 代替 ex...

        Select distinct(price) from table
        order by price
        limit 1
        offset 1;
        

        【讨论】:

          【解决方案6】:

          您可以使用以下之一:-

          select min(your_field) from your_table where your_field NOT IN (select distinct TOP 1 your_field from your_table ORDER BY your_field DESC)
          

          select top 1 ColumnName from TableName where ColumnName not in (select top 1 ColumnName from TableName order by ColumnName asc)
          

          【讨论】:

            【解决方案7】:

            我认为您可以使用 LIMITORDER BY

            找到第二个最小值
            select max(price) as minimum from (select distinct(price) from tableName order by price asc limit 2 ) --or 3, 4, 5, etc 
            

            如果你想找到第三个或第四个最小值等等......你可以通过更改限制中的最小值来找到。你可以用这个语句找到。

            【讨论】:

              【解决方案8】:

              这是一个很好的答案:

              SELECT MIN( price )
              FROM table
              WHERE price > ( SELECT MIN( price )
                              FROM table )
              

              确保在执行此操作时子查询中只有 1 行! (末尾括号中的部分)。

              例如,如果你想使用GROUP BY,你将不得不进一步定义:

              SELECT MIN( price )
              FROM table te1
              WHERE price > ( SELECT MIN( price )
                              FROM table te2 WHERE te1.brand = te2.brand)
              GROUP BY brand
              

              因为GROUP BY会给你多行,否则会报错:

              SQL 错误 [21000]:错误:用作表达式的子查询返回多行

              【讨论】:

                【解决方案9】:

                您可以使用RANK functions, 查询可能看起来很复杂,但可以通过相同的方式获得与其他答案类似的结果,

                WITH Temp_table AS (SELECT ITEM_ID,PRICE,RANK() OVER (ORDER BY PRICE) AS 
                Rnk 
                FROM YOUR_TABLE_NAME)
                SELECT ITEM_ID FROM Temp_table
                WHERE Rnk=2;
                

                【讨论】:

                  猜你喜欢
                  • 2012-10-31
                  • 1970-01-01
                  • 2017-05-10
                  • 2017-11-19
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-08-22
                  • 2023-01-15
                  • 2020-04-24
                  相关资源
                  最近更新 更多