MySQL - как получить столбцы в той же строке, что и значения, возвращаемые min / mx - PullRequest
1 голос
/ 13 мая 2010

Я не могу правильно оформить заголовок вопроса. Предположим, что таблица еженедельных доходов от фильмов приведена ниже:

MovieName  <Varchar(450)>
MovieGross <Decimal(18)>
WeekofYear <Integer>
Year       <Integer>

Так, как я могу получить имена лучших grossers для каждой недели этого года, если я делаю:

    select MovieName , Max(MovieGross) , WeekofYear 
from earnings where year = 2010 group by WeekofYear;

Тогда, очевидно, запрос не запустится, а

    select Max(MovieName) , Max(MovieGross) , WeekofYear 
from earnings where year = 2010 group by WeekofYear;

просто даст фильмы, начиная с самого низкого алфавита. Является ли использование group_concat(), а затем substring_index() единственным вариантом здесь?

    select 
       substring_index(group_concat(MovieName order by MovieGross desc),',',1),
       Max(MovieGross) , WeekofYear from earnings where year = 2010
    group by WeekofYear ;

Кажется неуклюжим. Есть ли лучший способ добиться этого?

Ответы [ 4 ]

2 голосов
/ 13 мая 2010

Это постоянно повторяющаяся проблема с максимальной группой. Вы решаете это, выбирая определяющие свойства своей группы, а затем соединяете свои «реальные» данные с этим.

select 
  e.MovieName, 
  e.MovieGross,
  e.WeekofYear 
from 
  earnings e
  inner join (
      select Max(MovieGross) MovieGross, Year, WeekofYear
        from earnings
    group by Year, WeekofYear
  ) max on max.Year       = e.Year 
       and max.WeekofYear = e.WeekofYear 
       and max.MovieGross = e.MovieGross
where
  e.year = 2010

Определяющими свойствами вашей группы являются Year, WeekofYear и MAX(MovieGross). Для каждого диапазона группы будет одна строка с разными значениями.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ к вашей таблице данных исключает все строки, которые не удовлетворяют определяющим свойствам вашей группы. Это также означает, что он пропускает все ряды, которые делают - вы можете получить два фильма, которые заработали одинаковую сумму денег в любую конкретную неделю. Снова сгруппируйте «внешний» запрос, чтобы исключить повторяющиеся строки в пользу одного фильма.

0 голосов
/ 13 мая 2010

Это довольно быстрый запрос, который выполняет свою работу:

SELECT e.WeekofYear as WeekofYear
, max(MovieGross) as MovieGross
, (SELECT MovieName FROM earnings
WHERE WeekofYear=e.WeekofYear ORDER BY MovieGross DESC LIMIT 1
) as MovieName
FROM earnings AS e
WHERE year='2010'
GROUP BY WeekofYear
ORDER BY WeekofYear;

Рад помочь вам:)

P.S. и спасибо за оценки;)

0 голосов
/ 13 мая 2010

Хорошо, попробую еще раз с предложением «иметь», я не могу с собой поделать.

Надеюсь, это поможет вам начать.Сначала создайте список недель года, затем для внутреннего запроса найдите тот, который имеет максимум для этой недели.

Select MovieName, max(MovieGross) as max_gross, WeekofYear 
from earnings 
where year = 2010 
order by MovieGross desc
Having MovieGross=max_gross
group by WeekofYear

Это должно возвращать самый кассовый фильм за каждую неделю.Это также должно вернуть несколько записей за неделю в случае ничьей.

0 голосов
/ 13 мая 2010

Вам необходимо определить максимальный недельный брутто, а затем выбрать название фильма на основе этого критерия. Примерно так:

SELECT e.MovieName, m.Gross, m.WeekofYear
FROM  earnings e JOIN
  (SELECT MAX(MovieGross) Gross, WeekofYear  
    FROM earnings WHERE `year` = 2010 GROUP BY WeekofYear) m
ON e.MovieGross=m.Gross AND e.WeekofYear=m.WeekofYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...