我有两个表(另请参见: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)。
答案 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