Агрегатные функции - получение столбцов, не включенных в предложение GROUP BY - PullRequest
1 голос
/ 14 ноября 2009

У меня есть таблица с тремя полями (item_id, source и price). (item_id, source и price) вместе составляют первичный ключ.

item_id    source      price
-------    -------     -----
1          paris       13
1          london      12
1          newyork     15
2          paris       22
2          london      15
2          newyork     14

Для каждого item_id я хочу знать самое дешевое место, чтобы получить его, и цену, которую я заплачу в этом месте. Для примера выше, я хотел бы видеть следующий вывод:

item_id    source     price
-------    -------    ---------
1          london     12
2          newyork    14

Есть ли простой способ сделать это без упоминания имени таблицы дважды? Я использую MySQL, поэтому я не могу использовать предложение WITH.

Я посмотрел на объединенное решение с двумя запросами в вопросе другого пользователя ( Группируйте связанные записи, но выбирайте определенные поля только из первой записи ), но я действительно хотел бы избежать упоминая таблицу дважды. Проблема в том, что простая таблица в этом вопросе фактически представляет собой встроенное представление в моей реальной задаче, для создания которого требуется около 5 секунд, поэтому я надеюсь найти альтернативы.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2009

Вот один из способов использования внутреннего соединения для фильтрации строк с наименьшей ценой:

select i.* 
from items i
inner join (
    select item_id, min(price) as minprice
    from items 
    group by item_id
) cheapest on i.price = cheapest.minprice
    and i.item_id = cheapest.item_id

Если есть несколько источников с наименьшей ценой, все они будут отображаться.

РЕДАКТИРОВАТЬ: поскольку ваш вопрос упоминает, что создание элементов занимает много времени, вы можете сохранить результат во временной таблице.

create temporary table temp_items 
as 
select item_id, source, price from YourView

А затем выполните запрос на группировку для временной таблицы. В MySQL временная таблица видна только текущему соединению и автоматически удаляется при закрытии соединения.

0 голосов
/ 02 сентября 2010

К сожалению, я не знаю наизусть преобразование данных и строк в MySQL. Но вот что может удивить вас, если вы немного помассируете его для правильного синтаксиса:

SELECT
   item_id,
   source = Convert(varchar(30), Substring(packed, 5, 30)),
   price = Convert(int, Substring(packed, 1, 4))
FROM
   (
      SELECT
         item_id,
         Min(Convert(binary(4), price) + Convert(varbinary(30), source) AS packed
      FROM items
      GROUP BY item_id
   ) X

Это, безусловно, взломать. Это определенно не должно использоваться во всех случаях. Но когда производительность критична, иногда она того стоит.

Подробнее см. .

...