合并两个表并创建新列

时间:2020-09-14 15:19:25

标签: sql postgresql

我有两个表(另请参见:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/573):

CREATE TABLE test1 (
  id serial,
  time timestamp,
  temperature double precision,
  instrument text
);

INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:24:02', 25.2, 'sensor1');
INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:24:02', 26.2, 'sensor2');
INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:25:02', 25.3, 'sensor1');
INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:25:02', 26.3, 'sensor2');
INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:26:03', 25.3, 'sensor1');
INSERT INTO test1 (time, temperature, instrument) VALUES ('2020-08-20 11:26:03', 26.3, 'sensor2');

CREATE TABLE test2 (
  id serial,
  time timestamp,
  humidity double precision
);

INSERT INTO test2 (time, humidity) VALUES ('2020-08-20 11:24:02', 85);
INSERT INTO test2 (time, humidity) VALUES ('2020-08-20 11:25:02', 86);
INSERT INTO test2 (time, humidity) VALUES ('2020-08-20 11:26:03', 87);
INSERT INTO test2 (time, humidity) VALUES ('2020-08-20 11:27:03', 88);

我想执行以下查询:

SELECT * FROM test1 JOIN test2 ON test1.time = test2.time

此查询的结果是我需要的:

| id  | time                     | temperature | instrument | id  | time                     | humidity |
| --- | ------------------------ | ----------- | ---------- | --- | ------------------------ | -------- |
| 1   | 2020-08-20T11:24:02.000Z | 25.2        | sensor1    | 1   | 2020-08-20T11:24:02.000Z | 85       |
| 2   | 2020-08-20T11:24:02.000Z | 26.2        | sensor2    | 1   | 2020-08-20T11:24:02.000Z | 85       |
| 3   | 2020-08-20T11:25:02.000Z | 25.3        | sensor1    | 2   | 2020-08-20T11:25:02.000Z | 86       |
| 4   | 2020-08-20T11:25:02.000Z | 26.3        | sensor2    | 2   | 2020-08-20T11:25:02.000Z | 86       |
| 5   | 2020-08-20T11:26:03.000Z | 25.3        | sensor1    | 3   | 2020-08-20T11:26:03.000Z | 87       |
| 6   | 2020-08-20T11:26:03.000Z | 26.3        | sensor2    | 3   | 2020-08-20T11:26:03.000Z | 87       |

但是我希望结果的格式如下:

time                     | humidity | sensor1 | sensor2 |
------------------------ | -------- | ------- | ------- |
2020-08-20T11:24:02.000Z | 85       | 25.2    | 26.2    |
2020-08-20T11:25:02.000Z | 86       | 25.3    | 26.3    |
2020-08-20T11:26:03.000Z | 87       | 25.3    | 26.3    |

我不知道如何实现这一目标,我想从数据中获取列标签(sensor1,sensor2)。

2 个答案:

答案 0 :(得分:1)

您还没有指定任何约束,所以我会这样尝试:

select test1.time,
       max(test2.humidity) as humidity,
       max(case when test1.instrument = 'sensor1' then temperature end) as sensor1,
       max(case when test1.instrument = 'sensor2' then temperature end) as sensor2       
  from test1
  join test2 on test1.time = test2.time
 group by test1.time
 order by test1.time

答案 1 :(得分:1)

您需要条件聚合。在Postgres中,您应该使用filter

SELECT t2.time, t2.humidity,
       MAX(t1.temperature) FILTER (WHERE t1.instrument = 'sensor1') as sensor1,
       MAX(t1.temperature) FILTER (WHERE t1.instrument = 'sensor2') as sensor2
FROM test1 t1 JOIN
     test2 
     ON t1.time = t2.time
GROUP BY t2.time, t2.humidity