我得到了下面的波斯格雷斯表格:
create table test (
id serial,
contract varchar,
amount int,
aggregated int,
is_aggregate int
);
insert into test (contract, amount, aggregated)
values ('abc', 100, 0),
('abc', 200, 0),
('xyz', 50, 0),
('xyz', 60, 0);
id | contract | amount | aggregated | is_aggregate |
---|---|---|---|---|
1 | abc | 100 | 0 | |
2 | abc | 200 | 0 | |
3 | xyz | 50 | 0 | |
4 | xyz | 60 | 0 |
我正在try 编写一条在每个合同的基础上插入聚合行的SQL语句,因此结果应该如下所示:
id | contract | amount | aggregated | is_aggregate |
---|---|---|---|---|
1 | abc | 100 | 1 | |
2 | abc | 200 | 1 | |
3 | xyz | 50 | 1 | |
4 | xyz | 60 | 1 | |
5 | abc | 300 | 1 | |
6 | xyz | 110 | 1 |
由于不断从另一个数据源添加新行,因此需要一次性插入聚合行并在已聚合的行中将‘Aggregate’设置为1,以避免并发问题.
我try 了几种方法,但我只走了这么远:
INSERT INTO test (contract, amount, aggregated, is_aggregate)
SELECT contract,
SUM(amount) AS sum_amount,
1,
1
FROM test
WHERE aggregated IS NULL
OR aggregated = 0
GROUP BY contract
HAVING COUNT(*) > 1;
这将插入聚集的行,但我不知道如何包含一个子句,以便为已经聚集的行将‘Aggregated’更新为1.
编辑:
经过几次"浓缩"后,数据将如下所示:
id | contract | amount | aggregated | is_aggregate |
---|---|---|---|---|
1 | abc | 100 | 1 | |
2 | abc | 200 | 1 | |
3 | xyz | 50 | 1 | |
4 | xyz | 60 | 1 | |
5 | abc | 300 | 1 | 1 |
6 | xyz | 110 | 1 | 1 |
7 | abc | 20 | 1 | |
8 | abc | 30 | 1 | |
9 | xyz | 70 | 1 | |
10 | xyz | 80 | 1 | |
11 | abc | 50 | 1 | 1 |
12 | xyz | 150 | 1 | 1 |
13 | abc | 350 | 1 | |
14 | xyz | 260 | 1 |
...其中,ID 11和12再次是第一次运行的聚集(如前面的ID 5和6),并且ID 13和14是前一次聚集运行的聚集(即,分别为ID 5和11以及ID 6和12).最后一次运行的聚合可以通过它们的‘Aggregated’=NULL来确定
注意:还有一些额外的‘time’列,可以根据这些列确定各行的聚合级别,以便在以后的业务逻辑中使用.为了简洁起见,这里省略了这些专栏.
有谁能帮帮我吗?先谢谢你.