SQL - 最小函数

时间:2011-06-19 13:49:58

标签: mysql sql oracle

我的问题是写一个SQL查询,确定哪个是最便宜的场地,可容纳120人。

我写的代码

select v.venuename, min(v.costperday)
from venues v 
where v.venuecapacity = 120
Group By v.venuename; 

我仍然得到了答案而不是最少答案。

但是如果我从select函数中删除V.venueName ......我得到了正确答案!

为什么会这样?

我们非常感谢您的帮助。 感谢

8 个答案:

答案 0 :(得分:2)

SELECT *
FROM (
    SELECT venuename, 
           costperday,
           min(costperday) over () as min_cost,
    FROM venues
    WHERE venuecapacity = 120
) v
WHERE v.min_cost = v.costperday

或使用子选择:

SELECT *
FROM venues
WHERE venuecapacity = 120
AND costperday = (SELECT min(v2.costperday) 
                  FROM venues v2
                  WHERE v2.venuecapacity = 120)

您可能希望使用场地容量>= 120,以防有超过120人的场地,但仍然比其他只有120人的场地便宜

答案 1 :(得分:1)

您在选择列表中包含相同的字段,因此将为每个字段计算最小值而非整体项目

答案 2 :(得分:0)

select v.venuename, min(v.costperday)
from 
(
  select venuename, costperday
  from venues
  where v.venuecapacity = 120) v

答案 3 :(得分:0)

这是因为如果您包含名称,则选择每个场地每天最低的费用。事实上,只要venuename是独一无二的,整个分组在这个表中是无用的。

要以最低价格获得场地,请使用以下内容:

select venuename, costperday
from
  venues v
where
  v.venuecapacity = 120 and
  v.costperday = (select min(costperday) from venue vs where va.venuecapacity = 120)

答案 4 :(得分:0)

我认为这可能是你想要的:

SELECT venuename
  FROM (SELECT venuename, costperday, MIN(costperday) OVER () mincost
          FROM venues
         WHERE venuecapacity >= 120) q
 WHERE q.costperday = q.mincost;

使用> = 120,因为您可能没有任何具有120个容量的场地,并且您希望所有可以处理至少 120的场地。您的要求仅表明场地能够容纳120人,而不仅仅是120人。

答案 5 :(得分:0)

使用CTE,可以

WITH minquery AS
 (SELECT min(costperday) AS mincost
  FROM venues
  WHERE venuecapacity>=120)
SELECT venuename, venuecapacity, costperday
  FROM venues 
  WHERE costperday=minquery.mincost AND venuecapacity>=120;

答案 6 :(得分:0)

  

我的问题是写一个SQL查询   将确定哪个是最少的   昂贵的场地,将容纳   120人。

在SQL Server中,我会使用select top 1... order by

select top 1 v.venuename, v.costperday
from venues v 
where v.venuecapacity = 120
order by v.costperday 

稍微瞥了一眼我发现MySQL和Oracle的这种语法看起来会起作用但我没有经过测试。

的MySQL

select v.venuename, v.costperday
from venues v 
where v.venuecapacity = 120
order by v.costperday 
limit 1

的Oracle

select v.venuename, v.costperday
from (select v.venuename, v.costperday
      from venues v 
      where v.venuecapacity = 120
      order by v.costperday
     )
where rownum = 1

答案 7 :(得分:0)

@Rahul Bhatia

还有一个我们可以使用的解决方案..

select v.venuename, 
       min(v.costperday) 
 from venues v  
 where v.venuecapacity >= 120 
 Group By v.venuename
 having min(v.costperday) = (
       select min(costperday)
       from venues 
       where venuecapacity >= 120 );