Вот мой оператор postgresql.
select sum("Color") as color,round(avg("Color")) as avg_color
from "color_table"
Как я могу установить условие для средней части?
Я провел небольшое исследование и обнаружил, что interval кажется очень полезным. Но я не знаю, где поставить условие.
Я просто хочу получить среднее значение для цвета, которое trandate имеет за последние 90 дней.
Ограничения по сумме нет.


Вот один из подходов:
SELECT
SUM(Color) AS color,
ROUND(AVG(CASE WHEN trandate < NOW() - INTERVAL '90 DAYS'
THEN Color END)) AS avg_color
FROM "color_table";
Это интерпретирует ваше требование как среднее количество записей, для которых trandate старше 90 дней. Если вместо этого вы хотите в пределах за последние 90 дней, измените неравенство.
Если вы используете Postgres 9.4 или новее, вы также можете использовать предложение FILTER:
SELECT
SUM(Color) AS color,
ROUND(AVG(Color) FILTER (WHERE trandate < NOW() - INTERVAL '90 DAYS')) AS avg_color
FROM "color_table";
Но когда я его выполняю, он возвращает ошибку: SQL Error [42601]: ERROR: syntax error at or near "as", которая указывает на последний as.
@YvKl Я не уверен, что эта ошибка связана с моим кодом.
Да, со вторым ответом работает. Спасибо за информацию.
вы можете попробовать, как показано ниже
with cte as
( select SUM(Color) AS color,0 as avg_color
FROM "color_table"
union all
select 0, avg(Color ) FROM "color_table"
where trandate < NOW() - INTERVAL '90 DAYS'
) select max(color) as color ,max(avg_color) as avg_color from cte
А как насчет суммы? Есть ли у вас временные ограничения на сумму?