Как установить условие для конкретной части в postgresql?

Вот мой оператор postgresql.

select sum("Color") as color,round(avg("Color")) as avg_color 
from "color_table"

Как я могу установить условие для средней части?

Я провел небольшое исследование и обнаружил, что interval кажется очень полезным. Но я не знаю, где поставить условие.

Я просто хочу получить среднее значение для цвета, которое trandate имеет за последние 90 дней.

А как насчет суммы? Есть ли у вас временные ограничения на сумму?

Tim Biegeleisen 15.11.2018 03:59

Ограничения по сумме нет.

Yv- 15.11.2018 04:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один из подходов:

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.

Yv- 15.11.2018 04:28

@YvKl Я не уверен, что эта ошибка связана с моим кодом.

Tim Biegeleisen 15.11.2018 04:37

Да, со вторым ответом работает. Спасибо за информацию.

Yv- 15.11.2018 04:40

вы можете попробовать, как показано ниже

 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

Другие вопросы по теме