10

我有下表:

 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 项都是最小值。简单的订购是不行的。

4

9 回答 9

8
SELECT MIN( price )
FROM table
WHERE price > ( SELECT MIN( price )
                FROM table )
于 2013-11-08T07:49:58.960 回答
4
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
)
于 2013-06-08T00:52:57.483 回答
3

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

更新

SELECT MIN(price)
FROM table
WHERE price NOT IN (SELECT DISTINCT TOP 1 price FROM table ORDER BY price)
于 2013-06-08T01:00:23.837 回答
1

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

select min(salary) 
from table 
where salary > (select min(salary) from table);
于 2021-10-14T14:19:41.050 回答
0

我想最简单的方法是使用标准 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;
于 2018-08-03T11:43:17.100 回答
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)

或者

select top 1 ColumnName from TableName where ColumnName not in (select top 1 ColumnName from TableName order by ColumnName asc)
于 2019-01-17T16:26:37.363 回答
0

我认为您可以使用LIMITORDER BY找到第二个最小值

select max(price) as minimum from (select distinct(price) from tableName order by price asc limit 2 ) --or 3, 4, 5, etc 

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

于 2019-07-15T15:48:09.023 回答
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]:错误:用作表达式的子查询返回多行

于 2019-11-14T13:48:45.737 回答
0

您可以使用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;
于 2021-10-14T14:52:36.680 回答