Получаем последнее значение каждого месяца в Postgresql

#postgresql #postgresql-9.3

#postgresql #postgresql-9.3

Вопрос:

На моей работе мне приходится запускать запрос (или я должен сказать, что это сделало бы мою жизнь в 100 раз проще), который возвращает -Сумма всех платежей за каждый месяц года -Итоговый баланс в конце каждого месяца.

Чтобы получить последнее, мне нужно выбрать столбец ‘ending_balance’ последней записи каждого месяца. У меня уже есть сумма, поэтому весь запрос будет выглядеть следующим образом

 select 
extract(month from request_date):: integer as mon,
extract(year from request_date)::integer as year,
<missing logic here> 
sum(total_amount),
from my_table group by 1,2 order by 2
  

Я искал ответ на stackoverflow и других сайтах в течение половины дня, и я выяснил, как получить значение для ОДНОГО месяца и года через

 select payer_id 
from my_table as last_payer 
where extract(month from request_date):: integer = '2' 
and extract(year from request_date)::integer= '2019' 
order by request_date desc limit 1
  

но это работает, только если я указываю конкретную дату. Мне нужно что-то, что делает это для каждого месяца и года. Замена жестко заданных значений на ‘mon’ и ‘year’ не работает.

Я также добавлю, что я работаю над dbeaver, который, как мне кажется, не поддерживает функции, но если функции — единственный способ, которым я могу это сделать, я думаю, я переключусь на простое использование командной строки.

Комментарии:

1. Можете ли вы поделиться некоторыми примерами данных и желаемыми результатами. Не очень понятно, что означает ending_balance значение последней записи каждого месяца». Держу пари , что коррелированный подзапрос или производная таблица помогли бы здесь, но я чувствую, что делаю некоторые предположения.

2. На самом деле я не хочу делиться информацией, которая слишком специфична для моей базы данных jobs, но «конечный баланс» — это просто значение a в каждой записи базы данных. Итак, в основном я хочу выбрать столбец из последней записи каждого месяца.

3. нельзя ли просто использовать оператор between между двумя датами? таким образом, у вас будет больше контроля между верхним и нижним пределом, и вы получите то, что хотите!

4. Как бы мне это сделать, чтобы в каждой строке были установлены даты в месяцах? Я знаю, как указать конкретные даты или использовать now (), но я не знаю, как я буду делать это для каждого месяца в году или за все время.

Ответ №1:

Этот запрос поможет вам.

Определенный месяц каждого года.

 select * from 
(select 
concat(extract(month from request_date):: integer,
extract(year from request_date)::integer) as dt
from table1) as a
group by dt
  

просто добавьте sum каждой группы.