mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 18:43:18 +08:00
87 lines
3.0 KiB
SQL
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
|