add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
select setseed(.42);

create table table1 as
select n::int as id
, n::int+'2019-09-01'::date as "date"
,(random()*1e3)::int as quantity
,(random()*1e3)::int as "value"
from generate_series(1,2e5)n;

alter table table1 add constraint table1_pk_id primary key(id);
create index on table1 (date,id)include(quantity);

select*from table1 tablesample bernoulli(.42)repeatable(.42)limit 8;
setseed
SELECT 1
SELECT 200000
ALTER TABLE
CREATE INDEX
id date quantity value
109 2019-12-19 802 504
616 2021-05-09 348 685
732 2021-09-02 780 889
876 2022-01-24 764 331
1316 2023-04-09 573 449
2131 2025-07-02 957 411
2141 2025-07-12 701 645
2787 2027-04-19 61 160
SELECT 8
vacuum analyze table1;
VACUUM
CREATE OR REPLACE FUNCTION functiontest()
RETURNS VOID
LANGUAGE plpgsql
AS
$f$
DECLARE _r RECORD;
DECLARE _previous_value DOUBLE PRECISION := 0;
BEGIN

FOR _r IN
SELECT table1.date, table1.id
FROM table1
ORDER BY table1.date, table1.id
LOOP
WITH
c AS
(
SELECT
table1.id,
table1.quantity + _previous_value AS total
FROM table1
WHERE table1.id = _r.id
ORDER BY table1.date, table1.id
LIMIT 1
)
SELECT
COALESCE(c.total, 0)
INTO _previous_value
FROM c;

EXECUTE $dsql$ UPDATE table1
SET value = $1
WHERE table1.id = $2 ;
$dsql$ USING _previous_value, _r.id;
END LOOP;
END;
CREATE FUNCTION
begin;
explain analyze verbose select functiontest();
select*from table1 order by date,id limit 30;
rollback;
BEGIN
QUERY PLAN
Result (cost=0.00..0.26 rows=1 width=4) (actual time=23138.435..23138.436 rows=1 loops=1)
  Output: functiontest()
Planning Time: 0.025 ms
Execution Time: 23138.473 ms
EXPLAIN
id date quantity value
1 2019-09-02 743 743
2 2019-09-03 937 1680
3 2019-09-04 94 1774
4 2019-09-05 491 2265
5 2019-09-06 575 2840
6 2019-09-07 570 3410
7 2019-09-08 838 4248
8 2019-09-09 131 4379
9 2019-09-10 312 4691
10 2019-09-11 82 4773
11 2019-09-12 410 5183
12 2019-09-13 423 5606
13 2019-09-14 977 6583
14 2019-09-15 943 7526
15 2019-09-16 489 8015
16 2019-09-17 206 8221
17 2019-09-18 272 8493
18 2019-09-19 274 8767
19 2019-09-20 854 9621
20 2019-09-21 783 10404
21 2019-09-22 826 11230
22 2019-09-23 235 11465
23 2019-09-24 917 12382
24 2019-09-25 119 12501
25 2019-09-26 314 12815
26 2019-09-27 188 13003
27 2019-09-28 108 13111
28 2019-09-29 632 13743
29 2019-09-30 29 13772
30 2019-10-01 905 14677
SELECT 30
ROLLBACK