@rancerenly

Как объединить 2 запроса в 1 в Postgresql или как изменить запрос ниже?

Выведите самую дорогую и дешевую покупку:
SELECT PIP.purchase_id, SUM(PIP.product_count * PR.new_price) AS all_sum
	FROM product_in_purchase AS PIP
		RIGHT OUTER JOIN price_register AS PR ON PIP.product_id = PR.product_id
		GROUP BY PIP.purchase_id
		ORDER BY SUM(PIP.product_count * PR.new_price) DESC LIMIT 1
	UNION [ALL]
SELECT PIP.purchase_id, SUM(PIP.product_count * PR.new_price) AS all_sum
	FROM product_in_purchase AS PIP
		RIGHT OUTER JOIN price_register AS PR ON PIP.product_id = PR.product_id
		GROUP BY PIP.purchase_id
		ORDER BY SUM(PIP.product_count * PR.new_price) LIMIT 1;
Может, подскажите, как корректнее построить запрос?
Есть что-то такое, но из-за полей в БД это решение не подходит:
SELECT 
	res.purchase_id,
	res.rnk_max,
	res.rnk_min
FROM (
	  SELECT 
	      pp.purchase_id,
	      DENSE_RANK() OVER(ORDER BY pp.product_price * pp.product_count DESC) AS rnk_max,
		  DENSE_RANK() OVER(ORDER BY pp.product_price * pp.product_count) AS rnk_min
      FROM public."Product_In_Purchase" AS pp
	 ) AS res
WHERE res.rnk_max = 1 OR res.rnk_min = 1

Вот поля в таблицах:
621d030725239644027455.png621d030f983b0106749117.png
  • Вопрос задан
  • 455 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
Чисто технически, без понимания сути происходящего:
WITH cte AS (
    SELECT PIP.purchase_id, SUM(PIP.product_count * PR.new_price) AS all_sum
    FROM product_in_purchase AS PIP
    RIGHT OUTER JOIN price_register AS PR ON PIP.product_id = PR.product_id
    GROUP BY PIP.purchase_id
)
( SELECT * FROM cte ORDER BY all_sum ASC LIMIT 1 )
UNION 
( SELECT * FROM cte ORDER BY all_sum DESC LIMIT 1 )
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы