#sql #postgresql #subquery #aggregate #aggregate-functions
#sql #postgresql #подзапрос #агрегировать #агрегатные функции
Вопрос:
У меня есть PostgreSQL, который работает, который использует несколько объединений, и один столбец, который является результатом вычисления. Из результата этого запроса мне нужно извлечь строки, в которых этот один столбец является максимальным, и их может быть много. Если бы их не было, я мог бы просто ORDER BY that_column DESC LIMIT 1
; и я обнаружил, что если бы мне просто нужно было это в существующей таблице базы данных, я мог бы просто сделать:
SELECT columns FROM table_name
WHERE that_coulmn = (SELECT MAX(that_column) FROM table_name)
Однако это также не так. У меня есть запрос, который выглядит следующим образом:
SELECT z.xyz, (x.aa- x.bb) * y.qq as that_column
FROM table_1 x
JOIN table_2 y ON x.foo = y.foo
JOIN table_3 z ON y.bar = z.bar
JOIN table_4 w ON w.baz = z.baz
where x.aa IS NOT NULL
Теперь это работает. Теперь мне нужно знать, как я помещаю это в качестве подзапроса и извлекаю из этого z.xyz
из строк, где that_column
значение максимально. Любая помощь?
Комментарии:
1. Я не понимаю. Все в ваших запросах правильно. Вы пробовали это? Должно ли это работать с уже имеющимися у вас знаниями.
2. Посмотрите на БОКОВОЕ СОЕДИНЕНИЕ
Ответ №1:
Может быть, это так?
SELECT MAX(thatmax.that_column) as theMax FROM (
SELECT z.xyz, (x.aa- x.bb) * y.qq as that_column
FROM table_1 x
JOIN table_2 y ON x.foo = y.foo
JOIN table_3 z ON y.bar = z.bar
JOIN table_4 w ON w.baz = z.baz
where x.aa IS NOT NULL
) thatmax
Комментарии:
1. Это хорошее направление, но, к сожалению, это даст мне только максимальное значение самого этого столбца, но не больше столбцов, откуда взялось это максимальное значение.
2. @CtrlAltDolev но какие столбцы вам также нужны? каждый столбец из каждой таблицы?
Ответ №2:
если вам нужно выбрать другие столбцы в качестве выходных данных:
select * from (
select *, dense() over(order by (x.aa- x.bb) * y.qq desc) as that_column
from table_1 x
join table_2 y ON x.foo = y.foo
join table_3 z ON y.bar = z.bar
join table_4 w ON w.baz = z.baz
where x.aa IS NOT NULL
) t where that_column = 1
Ответ №3:
Я нашел это!
Я взял это как подзапрос, использовал [rank]
(https://www.postgresqltutorial.com/postgresql-rank-function /) ранжировать по thatColumn
, а затем поместить это в другой подзапрос, чтобы взять те, у которых ранг =1
SELECT xyz
FROM
(xyz, thatColumn, RANK() OVER(ORDER BY thatColumn DESC) FROM (
-- the subquery in the question
)
) AS highest_and_rank
WHERE thatColumnRank = 1
Спасибо всем, кто пытался помочь. Ты потрясающий.
Комментарии:
1. В чем разница с ответом eshirvana? Я думаю, что это любезно предоставит человеку некоторый кредит или пометит его как правильное.