Как связать результат агрегатной функции со строкой в таблице при SELECT в Postgres

Вечер добрый. Не понимаю одну элементарную вещь.

Есть таблица items с совокупностью некоторых товаров. Есть таблица variations с указанием видов товара из items. То есть на один товар из items существует несколько вариантов комплектации/расцветки в таблице variations.

В таблице variations содержатся цены на каждый вариант комплектации товара из items.

Я использую INNER JOIN чтобы связать между собой все вещи из items и одну из вариаций из variations с минимальным значением цены.

SELECT items.id,
MIN(variations.price),
FROM variations INNER JOIN items ON variations.items_id = items.id GROUP BY items.id ORDER BY items.id

Однако есть еще несколько полей, которые я хочу получить из variations для записи с минимальной ценой. Например поле discount. Вопрос в том, как мне указать Postgres то, что он должен вытащить поле discount именно из записи с минимальной ценой, которая получена из агрегатной функции MIN.


Ответы (2 шт):

Автор решения: Egettl

Окей, мне удалось добиться желаемого результата обернув запрос в запрос. Хотя меня все еще не покидает чувство, что есть вариант проще. Но если варианта лучше не предложат, то возможно мой кому-то когда-то поможет.

SELECT secondary_table.items_id, secondary_table.var_price, MAX(variations.old_price) as var_old_price
    FROM variations
    INNER JOIN
        (SELECT items.id as items_id,
         MIN(var_table.price) as var_price
             FROM variations var_table INNER JOIN items ON var_table.items_id = items.id 
             GROUP BY items.id ORDER BY items.id) secondary_table
    ON 
        secondary_table.var_price = variations.price AND secondary_table.items_id = 
        variations.items_id GROUP BY secondary_table.items_id, secondary_table.var_price ORDER BY secondary_table.items_id
→ Ссылка
Автор решения: Stefanov.sm

Прошу извинения, писать по-русски мне непросто.
Результат можно получить используя замечательные выражения Postgresql distinct on and order by вместо использования агрегатных функций.

Здесь немного модифицированный ваш запрос

SELECT distinct on (items.id)
  items.id,
  variations.price,
  variations.discount
  -- maybe other fields & expressions here
FROM variations INNER JOIN items ON variations.items_id = items.id
ORDER BY items.id, variations.price;
→ Ссылка