@sashavol

Двойной SELECT вместе с UNION и возвратом наибольшего значения, как?

Доброго времени суток
2 дня пытаюсь сделать правильным запрос.

Задача заключается в том, чтобы при двойном запросе в таблицу вернуть наибольшее одно значение, но с UNION мне никак не удается это сделать при двойном запросе, возвращает 2 строки, но мне нужна одна строка с наибольшим значением столбца "rate". Задачу усложняет то, что перед тем как сравнить у 2 строк поле "rate" необходимо его умножить у каждой строки на значение n.

Запрос выглядит вот так:
SELECT * FROM (
		SELECT rate, type, route_id, weight, volume,
			row_number() OVER (PARTITION BY route_id ORDER BY volume) as num
		FROM test_rates rs
		WHERE
			rs.dt_del IS NULL
			AND rs.volume >= 300  -- первая выборка
	UNION
		SELECT rate, type, route_id, weight, volume,
			row_number() OVER (PARTITION BY route_id ORDER BY weight) as num
		FROM test_rates rs
		WHERE
			rs.dt_del IS NULL
			AND rs.weight >= 50000  -- вторая выборка
) q1
WHERE q1.num = 1 -- возвращаем только 1 строку


Сама таблица из себя представляет следующее (откройте вкладку result):

2 ключевых столбика это "weight" and "volume" для первого и второго запроса соответственно.

Результат первого запроса , вот такой (откройте вкладку result):


Можно на коммерческой основе. Я думаю здесь можно обойтись и без union, но полагаю с ним мы получаем нужные строки и можем работать с ними.
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ответы на вопрос 3
tsklab
@tsklab
Здесь отвечаю на вопросы.
Подзапросом найдите MAX(rate) и запросите строку с этим значением.
Ответ написан
Комментировать
@Vitsliputsli
Можно так:
SELECT rate, type, route_id, weight, volume FROM (
	SELECT rate, type, route_id, weight, volume,
			CASE WHEN rs.volume >= 300 THEN
				row_number() OVER (PARTITION BY route_id ORDER BY volume) 
			ELSE null END r_volume,
			CASE WHEN rs.weight >= 50000 THEN
				row_number() OVER (PARTITION BY route_id ORDER BY weight)
			ELSE null END r_weight
		FROM test_rates rs
		WHERE
		  rs.dt_del IS NULL
		  AND (rs.volume >= 300 OR rs.weight >= 50000)
		
) WHERE r_volume=1 OR r_weight=1
ORDER BY rate DESC
LIMIT 1
Ответ написан
Комментировать
LaRN
@LaRN
Senior Developer
Можно через временны запрос попробовать:
WITH rates as
(SELECT rate, type, route_id, weight, volume
   FROM test_rates rs
  WHERE rs.dt_del IS NULL
    AND (rs.volume >= 300 OR rs.weight >= 50000))
SELECT rate, type, route_id, weight, volume
  FROM rates
 where rate = (select max(rate) from rates)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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