Вычисление отношения к максимуму в Postgres

#postgresql #max

Вопрос:

У меня есть эта таблица в Postgres:

имя — варчар, вес и рост — int4. Мне нужно рассчитать соотношение веса к максимальному весу и роста к максимальной высоте для каждой записи.

Пока у меня есть только это:

 select people.name, people.weight, people.height, people.weight/max(people.weight) 
as weight_ratio, people.height/max(people.height) from people
 

но я получаю эту ошибку: column "people.name" must appear in the GROUP BY clause or be used in an aggregate function

Как мне устранить эту проблему?

Ответ №1:

Используйте MAX() функцию окна:

 SELECT name, weight, height, 
       weight / MAX(weight) OVER() weight_ratio, 
       height / MAX(height) OVER() height_ratio 
FROM people
 

Если weight и height являются целыми числами, вы также должны умножить на 1.0 перед делением, потому что Postgresql выполняет целочисленное деление между целыми числами и усекает любую десятичную часть:

 SELECT name, weight, height, 
       1.0 * weight / MAX(weight) OVER() weight_ratio, 
       1.0 * height / MAX(height) OVER() height_ratio 
FROM people