Используйте оконные функции в сочетании с DISTINCT, чтобы получить самую низкую и первую цену одновременно (без подвыбора в соответствии с запросом):
SELECT DISTINCT ON (i.client_id)
i.client_id
, min(ir.price) OVER (PARTITION BY i.client_id) AS min_price
, first_value(ir.price) OVER (PARTITION BY i.client_id
ORDER BY ir.invoice_id) AS first_price
FROM invoices_rows ir
JOIN invoices i USING (client_id)
WHERE ir.product_id = 45;
Применить DISTINCT ON
(client_id), чтобы получить только один ряд на client_id
.DISTINCT применяется после оконных функций, в то время как GROUP BY
будет применяться раньше.
Я предполагаю, что «первый счет» можно интерпретировать как «самый низкий invoice_id
».Вам нужна «самая низкая цена продажи» для каждого клиента?Или общая самая низкая цена на товар?Я изменил на "per client_id" сейчас.Кажется более вероятным.
Если вы не возражаете против выбора или CTE, это, вероятно, будет работать лучше:
WITH x AS (
SELECT i.client_id
, min(ir.price) AS min_price
, min(ir.invoice_id) AS invoice_id
FROM invoices_rows ir
JOIN invoices i USING (client_id)
WHERE ir.product_id = 45
)
SELECT x.*, ir.price AS first_price
FROM x
JOIN invoices_rows ir USING (invoice_id)