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?.
CREATE TABLE account AS
Select 1111 as device_id Union All
Select 2222;
Select * From account;
SELECT 2
device_id
1111
2222
SELECT 2
CREATE TABLE water_consumption AS

Select 1111 as meter_id, To_Timestamp('09/10/2024 00:00', 'mm/dd/yyyy hh24:mi') as start_read_time_local, To_Timestamp('09/10/2024 01:00', 'mm/dd/yyyy hh24:mi') as end_read_time_local, 79118.91 as start_read , 79118.93 as end_read, 0.02 as consumption Union All
Select 1111, To_Timestamp('09/10/2024 03:00', 'mm/dd/yyyy hh24:mi'), To_Timestamp('09/10/2024 04:00', 'mm/dd/yyyy hh24:mi'), 79122.47, 79123.99, 1.52 Union All
Select 2222, To_Timestamp('09/10/2024 00:00', 'mm/dd/yyyy hh24:mi'), To_Timestamp('09/10/2024 01:00', 'mm/dd/yyyy hh24:mi'), 1937135, 1937174, 39 Union All
Select 2222, To_Timestamp('09/10/2024 01:00', 'mm/dd/yyyy hh24:mi'), To_Timestamp('09/10/2024 02:00', 'mm/dd/yyyy hh24:mi'), 1937174, 1937191, 17 Union All
Select 2222, To_Timestamp('09/10/2024 02:00', 'mm/dd/yyyy hh24:mi'), To_Timestamp('09/10/2024 03:00', 'mm/dd/yyyy hh24:mi'), 1937191, 1937197, 6 Union All
Select 2222, To_Timestamp('09/10/2024 03:00', 'mm/dd/yyyy hh24:mi'), To_Timestamp('09/10/2024 04:00', 'mm/dd/yyyy hh24:mi'), 1937197, 1937202, 5;
Select * From water_consumption;
SELECT 6
meter_id start_read_time_local end_read_time_local start_read end_read consumption
1111 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 79118.91 79118.93 0.02
1111 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 79122.47 79123.99 1.52
2222 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 1937135 1937174 39
2222 2024-09-10 01:00:00+00 2024-09-10 02:00:00+00 1937174 1937191 17
2222 2024-09-10 02:00:00+00 2024-09-10 03:00:00+00 1937191 1937197 6
2222 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 1937197 1937202 5
SELECT 6
WITH
grid AS
( Select a.device_id as meter_id,
DATE_TRUNC('day', wc.start_read_time_local) + interval '1 minute' * (gs * 60) as read_start,
DATE_TRUNC('day', wc.start_read_time_local) + interval '1 minute' * ((gs + 1) * 60) as read_end,
Min(wc.start_read_time_local) as min_start_time,
Max(wc.start_read_time_local) as max_end_time
From account a
Inner Join water_consumption wc ON(wc.meter_id = a.device_id)
Cross Join generate_series(0, 23) gs
Group By a.device_id, gs, DATE_TRUNC( 'day', wc.start_read_time_local)
)
Select g.meter_id,
Coalesce(wc.start_read_time_local, g.read_start) as start_read_time_local,
Coalesce(wc.end_read_time_local, g.read_end) as end_read_time_local,
wc.start_read, wc.end_read, wc.consumption,
Case When wc.start_read_time_local Is Null Then 'Missing Data' End as notes
From grid g
Left Join water_consumption wc ON(wc.meter_id = g.meter_id And
wc.start_read_time_local = g.read_start )
Where read_start >= min_start_time And read_start <= max_end_time
Order By g.meter_id, g.read_start

meter_id start_read_time_local end_read_time_local start_read end_read consumption notes
1111 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 79118.91 79118.93 0.02 null
1111 2024-09-10 01:00:00+00 2024-09-10 02:00:00+00 null null null Missing Data
1111 2024-09-10 02:00:00+00 2024-09-10 03:00:00+00 null null null Missing Data
1111 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 79122.47 79123.99 1.52 null
2222 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 1937135 1937174 39 null
2222 2024-09-10 01:00:00+00 2024-09-10 02:00:00+00 1937174 1937191 17 null
2222 2024-09-10 02:00:00+00 2024-09-10 03:00:00+00 1937191 1937197 6 null
2222 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 1937197 1937202 5 null
SELECT 8
WITH
grid AS
( Select a.device_id as meter_id,
DATE_TRUNC('day', wc.start_read_time_local) + interval '1 minute' * (gs * 60) as read_start,
DATE_TRUNC('day', wc.start_read_time_local) + interval '1 minute' * ((gs + 1) * 60) as read_end,
Min(wc.start_read_time_local) as min_start_time,
Max(wc.start_read_time_local) as max_end_time
From account a
Inner Join water_consumption wc ON(wc.meter_id = a.device_id)
Cross Join generate_series(0, 23) gs
Group By a.device_id, gs, DATE_TRUNC( 'day', wc.start_read_time_local)
)
Select g.meter_id,
Coalesce(wc.start_read_time_local, g.read_start) as start_read_time_local,
Coalesce(wc.end_read_time_local, g.read_end) as end_read_time_local,
wc.start_read, wc.end_read, wc.consumption,
Case When wc.start_read_time_local Is Null Then 'Missing Data' End as notes
From grid g
Left Join water_consumption wc ON(wc.meter_id = g.meter_id And
wc.start_read_time_local = g.read_start )
Order By g.meter_id, g.read_start

meter_id start_read_time_local end_read_time_local start_read end_read consumption notes
1111 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 79118.91 79118.93 0.02 null
1111 2024-09-10 01:00:00+00 2024-09-10 02:00:00+00 null null null Missing Data
1111 2024-09-10 02:00:00+00 2024-09-10 03:00:00+00 null null null Missing Data
1111 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 79122.47 79123.99 1.52 null
1111 2024-09-10 04:00:00+00 2024-09-10 05:00:00+00 null null null Missing Data
1111 2024-09-10 05:00:00+00 2024-09-10 06:00:00+00 null null null Missing Data
1111 2024-09-10 06:00:00+00 2024-09-10 07:00:00+00 null null null Missing Data
1111 2024-09-10 07:00:00+00 2024-09-10 08:00:00+00 null null null Missing Data
1111 2024-09-10 08:00:00+00 2024-09-10 09:00:00+00 null null null Missing Data
1111 2024-09-10 09:00:00+00 2024-09-10 10:00:00+00 null null null Missing Data
1111 2024-09-10 10:00:00+00 2024-09-10 11:00:00+00 null null null Missing Data
1111 2024-09-10 11:00:00+00 2024-09-10 12:00:00+00 null null null Missing Data
1111 2024-09-10 12:00:00+00 2024-09-10 13:00:00+00 null null null Missing Data
1111 2024-09-10 13:00:00+00 2024-09-10 14:00:00+00 null null null Missing Data
1111 2024-09-10 14:00:00+00 2024-09-10 15:00:00+00 null null null Missing Data
1111 2024-09-10 15:00:00+00 2024-09-10 16:00:00+00 null null null Missing Data
1111 2024-09-10 16:00:00+00 2024-09-10 17:00:00+00 null null null Missing Data
1111 2024-09-10 17:00:00+00 2024-09-10 18:00:00+00 null null null Missing Data
1111 2024-09-10 18:00:00+00 2024-09-10 19:00:00+00 null null null Missing Data
1111 2024-09-10 19:00:00+00 2024-09-10 20:00:00+00 null null null Missing Data
1111 2024-09-10 20:00:00+00 2024-09-10 21:00:00+00 null null null Missing Data
1111 2024-09-10 21:00:00+00 2024-09-10 22:00:00+00 null null null Missing Data
1111 2024-09-10 22:00:00+00 2024-09-10 23:00:00+00 null null null Missing Data
1111 2024-09-10 23:00:00+00 2024-09-11 00:00:00+00 null null null Missing Data
2222 2024-09-10 00:00:00+00 2024-09-10 01:00:00+00 1937135 1937174 39 null
2222 2024-09-10 01:00:00+00 2024-09-10 02:00:00+00 1937174 1937191 17 null
2222 2024-09-10 02:00:00+00 2024-09-10 03:00:00+00 1937191 1937197 6 null
2222 2024-09-10 03:00:00+00 2024-09-10 04:00:00+00 1937197 1937202 5 null
2222 2024-09-10 04:00:00+00 2024-09-10 05:00:00+00 null null null Missing Data
2222 2024-09-10 05:00:00+00 2024-09-10 06:00:00+00 null null null Missing Data
2222 2024-09-10 06:00:00+00 2024-09-10 07:00:00+00 null null null Missing Data
2222 2024-09-10 07:00:00+00 2024-09-10 08:00:00+00 null null null Missing Data
2222 2024-09-10 08:00:00+00 2024-09-10 09:00:00+00 null null null Missing Data
2222 2024-09-10 09:00:00+00 2024-09-10 10:00:00+00 null null null Missing Data
2222 2024-09-10 10:00:00+00 2024-09-10 11:00:00+00 null null null Missing Data
2222 2024-09-10 11:00:00+00 2024-09-10 12:00:00+00 null null null Missing Data
2222 2024-09-10 12:00:00+00 2024-09-10 13:00:00+00 null null null Missing Data
2222 2024-09-10 13:00:00+00 2024-09-10 14:00:00+00 null null null Missing Data
2222 2024-09-10 14:00:00+00 2024-09-10 15:00:00+00 null null null Missing Data
2222 2024-09-10 15:00:00+00 2024-09-10 16:00:00+00 null null null Missing Data
2222 2024-09-10 16:00:00+00 2024-09-10 17:00:00+00 null null null Missing Data
2222 2024-09-10 17:00:00+00 2024-09-10 18:00:00+00 null null null Missing Data
2222 2024-09-10 18:00:00+00 2024-09-10 19:00:00+00 null null null Missing Data
2222 2024-09-10 19:00:00+00 2024-09-10 20:00:00+00 null null null Missing Data
2222 2024-09-10 20:00:00+00 2024-09-10 21:00:00+00 null null null Missing Data
2222 2024-09-10 21:00:00+00 2024-09-10 22:00:00+00 null null null Missing Data
2222 2024-09-10 22:00:00+00 2024-09-10 23:00:00+00 null null null Missing Data
2222 2024-09-10 23:00:00+00 2024-09-11 00:00:00+00 null null null Missing Data
SELECT 48