timescaledb/test/sql/merge.sql
2022-11-18 16:31:47 -03:00

87 lines
3.0 KiB
SQL

-- This file and its contents are licensed under the Apache License 2.0.
-- Please see the included NOTICE for copyright information and
-- LICENSE-APACHE for a copy of the license.
-- Create conditions table with location and temperature
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
location SMALLINT NOT NULL,
temperature DOUBLE PRECISION NULL
);
SELECT create_hypertable(
'conditions',
'time',
chunk_time_interval => INTERVAL '5 seconds');
INSERT INTO conditions
SELECT time, location, 14 as temperature
FROM generate_series(
'2021-01-01 00:00:00',
'2021-01-01 00:00:09',
INTERVAL '5 seconds'
) as time,
generate_series(1,4) as location;
-- Create conditions_updated table with location and temperature
CREATE TABLE conditions_updated (
time TIMESTAMPTZ NOT NULL,
location SMALLINT NOT NULL,
temperature DOUBLE PRECISION NULL
);
SELECT create_hypertable(
'conditions_updated',
'time',
chunk_time_interval => INTERVAL '5 seconds');
-- Generate data that overlaps with conditions table
INSERT INTO conditions_updated
SELECT time, location, 80 as temperature
FROM generate_series(
'2021-01-01 00:00:05',
'2021-01-01 00:00:14',
INTERVAL '5 seconds'
) as time,
generate_series(1,4) as location;
-- Print table/rows/num of chunks
select * from conditions order by time, location asc;
select * from conditions_updated order by time, location asc;
select hypertable_name, count(*) as num_of_chunks from timescaledb_information.chunks group by hypertable_name;
-- Print expected values in the conditions table once conditions_updated is merged into it
-- If a key exists in both tables, we take average of the temperature measured
-- average logic here is a mess but it works
SELECT COALESCE(c.time, cu.time) as time,
COALESCE(c.location, cu.location) as location,
(COALESCE(c.temperature, cu.temperature) + COALESCE(cu.temperature, c.temperature))/2 as temperature
FROM conditions AS c FULL JOIN conditions_updated AS cu
ON c.time = cu.time AND c.location = cu.location;
-- Test that normal PostgreSQL tables can merge without exceptions
CREATE TABLE conditions_pg AS SELECT * FROM conditions;
CREATE TABLE conditions_updated_pg AS SELECT * FROM conditions_updated;
MERGE INTO conditions_pg c
USING conditions_updated_pg cu
ON c.time = cu.time AND c.location = cu.location
WHEN MATCHED THEN
UPDATE SET temperature = (c.temperature + cu.temperature)/2
WHEN NOT MATCHED THEN
INSERT (time, location, temperature) VALUES (cu.time, cu.location, cu.temperature);
SELECT * FROM conditions_pg ORDER BY time, location ASC;
-- Merge conditions_updated into conditions
\set ON_ERROR_STOP 0
MERGE INTO conditions c
USING conditions_updated cu
ON c.time = cu.time AND c.location = cu.location
WHEN MATCHED THEN
UPDATE SET temperature = (c.temperature + cu.temperature)/2
WHEN NOT MATCHED THEN
INSERT (time, location, temperature) VALUES (cu.time, cu.location, cu.temperature);
SELECT * FROM conditions ORDER BY time, location ASC;
\set ON_ERROR_STOP 1