Ссылаясь на динамические столбцы в postgres-запросе?

Скажем, у меня есть что-то вроде этого:

select sum(points) as total_points
from sometable
where total_points > 25
group by username

Я не могу ссылаться на total_points в предложении where, потому что получаю следующую ошибку: ERROR: column "total_points" does not exist. В этом случае у меня не возникло бы проблемы с переписыванием sum(points) в предложении where, но я хотел бы как-то сделать то, что у меня было выше.

  • Есть ли способ сохранить результат в переменной без использования хранимой процедуры?
  • Если я переписываю sum(points) в предложении where, является ли postgres достаточно умным, чтобы не пересчитать его?

Ответы

Ответ 1

Я считаю, что PostgreSQL похож на другие бренды sql, где вам нужно делать:

SELECT t.* 
FROM (
    SELECT SUM(points) AS total_points
    FROM sometable
    GROUP BY username
) t
WHERE total_points > 25

РЕДАКТИРОВАТЬ: Забыл в подзапрос псевдонима.

Ответ 2

SELECT  SUM(points) AS total_points
FROM    sometable
GROUP BY
        username
HAVING  SUM(points) > 25

PostgreSQL не будет вычислять сумму дважды.

Ответ 3

У вас есть сообщение об ошибке:

select sum(points) as total_points
from sometable
where total_points > 25 -- <- error here
group by username

Вы не можете ограничить строки total_points, потому что sometable не имеют этого столбца. Вы хотите ограничить результирующие строки с помощью total_points, вычисленных для каждой группы, так:

select sum(points) as total_points
from sometable
group by username
having sum(points) > 25

Если вы замените total_point в своем примере, тогда вы просто очистите, если сумма, вычисленная из всех строк, больше 25, а затем вернет все строки, сгруппированные по имени пользователя.

Edit:
Всегда помните порядок:

  • FROM с JOIN для получения таблиц
  • - WHERE для предельных строк из таблиц
  • SELECT для предельных столбцов
  • - GROUP BY для групповых строк в связанные группы
  • - HAVING для конечных групп
  • - ORDER BY для результатов заказа