Кумулятивная сумма 2 столбцов - PullRequest
0 голосов
/ 29 мая 2020

Я использую Postgresql 11.

У меня есть 2 таблицы - txn_table и summary_table

create table txn_table(id int, txn_date timestamp, amount decimal);

create table summary_table(id int, txn_date date, day_Total decimal, Cumulative_Total decimal);

Пример данных для txn_table:

insert into txn_table values (1, '2020-05-28 10:05:05', 100.00);
insert into txn_table values(2, '2020-05-28 11:45:10', 200.00);
insert into txn_table values(3, '2020-05-29 10:05:05', 300.00);
insert into txn_table values(4, '2020-05-29 12:10:01', 400.00);

Я хочу для вставки данных в сводную_таблицу, как показано ниже

  1. day_total содержит сумму за конкретный день
  2. Cumulative_total содержит совокупную сумму day_total
| id  | txn_date                 | day_total | cumulative_total |
| --- | ------------------------ | --------- | ---------------- |
| 1   | 2020-05-28               | 300       | 300              |
| 2   | 2020-05-29               | 700       | 1000             |

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Думаю, этот выбор может решить вашу проблему:

insert into summary_table
select row_number() over w as id
     , txn_date
     , day_total
     , sum(day_total) over w as cumulative_total
from (
  select txn_date::date as txn_date, sum(amount) as day_total
  from txn_table
  group by txn_date::date
) d
window w as (order by txn_date)
order by txn_date

(Я проработал это в голове, не пробовал. Возможно, подготовьте скрипт db или CTE с образцом ввода.)

0 голосов
/ 29 мая 2020

выполните следующие действия:

Добавьте уникальное ограничение в txn_date столбец summary_table.

create table summary_table(id SERIAL PRIMARY KEY, txn_date date unique, day_total decimal, cumulative_total decimal);

, если вы хотите игнорировать дубликаты . используйте указанный ниже запрос

insert into summary_table(txn_date,day_total,cumulative_total)
(select  txn_date, day_total, sum(day_total) over (order by txn_date) as cumulative_total from (
  select txn_date::date as txn_date, sum(amount) as day_total
  from txn_table
  group by txn_date::date
) d 
order by txn_date)
on conflict(txn_date)
do nothing;

, если вы хотите обновить повторяющиеся значения в summary_table. используйте указанный ниже запрос

insert into summary_table(txn_date,day_total,cumulative_total)
(select  txn_date, day_total, sum(day_total) over (order by txn_date) as cumulative_total from (
  select txn_date::date as txn_date, sum(amount) as day_total
  from txn_table
  group by txn_date::date
) d 
order by txn_date)
on conflict(txn_date)
do update set day_total=EXCLUDED.day_total,
cumulative_total=EXCLUDED.cumulative_total;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...