Ссылаясь на динамические столбцы в 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
для результатов заказа