SQL - минимальная функция - PullRequest
1 голос
/ 19 июня 2011

Мой вопрос: напишите SQL-запрос, который определит, какое наименее дорогое место для 120 человек.

Код, который я написал

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

Я все еще получаюответы, а не наименее.

Но если я удаляю V.venueName из функции выбора ..... я получаю правильный ответ!

Почему это так?

Ваша помощь будет принята с благодарностью.Спасибо

Ответы [ 8 ]

2 голосов
/ 19 июня 2011
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 голос
/ 19 июня 2011

Вы включаете одно и то же поле в список выбора, таким образом, минимальная сумма будет вычислена для каждого из них, а не для всех элементов

0 голосов
/ 20 июня 2011

@ Рахул Бхатия

есть еще одно решение, которое мы можем использовать ..

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 );  
0 голосов
/ 20 июня 2011

Мой вопрос: написать запрос 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
0 голосов
/ 19 июня 2011

Используя 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;
0 голосов
/ 19 июня 2011

Я думаю, что это может быть то, что вы хотите:

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 человек.

0 голосов
/ 19 июня 2011

Это потому, что вы выбираете самую низкую стоимость в день для каждого места, если вы включаете название.Фактически, вся группировка в этой таблице бесполезна, пока venuename уникален.

Чтобы получить место по самой низкой цене, используйте что-то вроде этого:

select venuename, costperday
from
  venues v
where
  v.venuecapacity = 120 and
  v.costperday = (select min(costperday) from venue vs where va.venuecapacity = 120)
0 голосов
/ 19 июня 2011
select v.venuename, min(v.costperday)
from 
(
  select venuename, costperday
  from venues
  where v.venuecapacity = 120) v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...