PostgreSQL: поиск строк, где значение равно максимальному в подзапросе

#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? Я думаю, что это любезно предоставит человеку некоторый кредит или пометит его как правильное.