SQL。有没有有效的方法来找到第二低的价值?

时间:2013-06-08 00:47:20

标签: sql db2 subquery

我有下表:

 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:请注意,minimum不是唯一值。例如,第1项和第4项都是最小值。简单的订购不会。

8 个答案:

答案 0 :(得分:4)

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

<强>已更新

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

答案 1 :(得分:4)

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

答案 2 :(得分: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
)

答案 3 :(得分:1)

您可以使用order by然后使用this answer中的方法选择第2行。

答案 4 :(得分:0)

我想最简单的方法是使用标准sql的偏移量获取过滤器,如果您的列中没有重复值,则不必区分。

OtherDTO

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

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

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

答案 5 :(得分:0)

您可以使用以下之一:-

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)

OR

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

答案 6 :(得分:0)

我认为您可以使用 LIMIT ORDER BY

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

如果要查找第三或第四最低限额,依此类推...可以通过更改最低限额来找出答案。您可以使用此语句。

答案 7 :(得分:0)

这是一个很好的答案:

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]:错误:用作表达式的子查询返回的一行以上