使用 WHERE 和 AS 从数据库中提取数据
Extracting Data from DB with WHERE and AS
我有一个 table,其中包含不同年份建筑物的模拟数据,其中每年都有一行。 column-headings 是
id / year / avg_heat_demand / renovation_level / co2_emission / [and some more]
我现在想创建一个只有 avg_heat_demand 的 table 作为一个库,比如
id / avg_heat_demand_2015 / avg_heat_demand_2025 / avg_heat_demand_2050
我知道我想说什么,但我猜我无法按正确的顺序排列 SQL-Statements。例如,我尝试过(我知道这不是正确的方法,但它可能最好地解释了我想做什么):
CREATE TABLE output_time AS
SELECT id,
year,
(avg_heat_demand WHERE year = 2015) AS avg_heat_demand_m2_2015,
(avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2025,
(avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2050
FROM simulation_output;
示例数据:
id | year | avg_heat_demand | etc
----+-----+-----------------+----
11 | 2015 | 55 +
12 | 2015 | 40 +
11 | 2016 | 48 +
12 | 2016 | 49 +
11 | 2025 | 45 +
12 | 2025 | 43 +
11 | 2050 | 50 +
12 | 2050 | 52 +
我想要的结果:
id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050
---+----------------------+----------------------+---------------------
11 | 55 | 45 | 50
12 | 40 | 43 | 52
基于此数据:
id | avg_heat_demand | year
----+-----------------+------
11 | 55 | 2015
12 | 40 | 2015
11 | 45 | 2025
12 | 43 | 2025
11 | 50 | 2050
12 | 52 | 2050
(6 Zeilen)
尝试使用子查询:
SELECT
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2015) AS avg_2015,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2025) AS avg_2025,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2050) AS avg_2050;
avg_2015 | avg_2025 | avg_2050
---------------------+---------------------+---------------------
47.5000000000000000 | 44.0000000000000000 | 51.0000000000000000
(1 Zeile)
如果您能负担得起多行结果,请尝试以下查询:
SELECT year,AVG(avg_heat_demand)
FROM simulation_output
GROUP BY year
ORDER BY year
year | avg
------+---------------------
2015 | 47.5000000000000000
2025 | 44.0000000000000000
2050 | 51.0000000000000000
(3 Zeilen)
EDIT:基于 OP 的编辑(不同的所需输出格式)
SELECT DISTINCT i.id,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2015 AND j.id = i.id) AS avg_heat_demand_2015,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2025 AND j.id = i.id) AS avg_heat_demand_2025,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2050 AND j.id = i.id) AS avg_heat_demand_2050
FROM simulation_output i
id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050
----+----------------------+----------------------+----------------------
11 | 55 | 45 | 50
12 | 40 | 43 | 52
(2 Zeilen)
我知道找到了使用交叉表功能的解决方案:
SELECT *
FROM crosstab('select id, year, avg_heat_demand FROM simulation_output order by 1,2')
AS final_result(id character varying, avg_heat_demand_m2_2015 double precision, avg_heat_demand_m2_2025 double precision, avg_heat_demand_m2_2050 double precision);
所述
我有一个 table,其中包含不同年份建筑物的模拟数据,其中每年都有一行。 column-headings 是
id / year / avg_heat_demand / renovation_level / co2_emission / [and some more]
我现在想创建一个只有 avg_heat_demand 的 table 作为一个库,比如
id / avg_heat_demand_2015 / avg_heat_demand_2025 / avg_heat_demand_2050
我知道我想说什么,但我猜我无法按正确的顺序排列 SQL-Statements。例如,我尝试过(我知道这不是正确的方法,但它可能最好地解释了我想做什么):
CREATE TABLE output_time AS
SELECT id,
year,
(avg_heat_demand WHERE year = 2015) AS avg_heat_demand_m2_2015,
(avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2025,
(avg_heat_demand WHERE year = 2050) AS avg_heat_demand_m2_2050
FROM simulation_output;
示例数据:
id | year | avg_heat_demand | etc
----+-----+-----------------+----
11 | 2015 | 55 +
12 | 2015 | 40 +
11 | 2016 | 48 +
12 | 2016 | 49 +
11 | 2025 | 45 +
12 | 2025 | 43 +
11 | 2050 | 50 +
12 | 2050 | 52 +
我想要的结果:
id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050
---+----------------------+----------------------+---------------------
11 | 55 | 45 | 50
12 | 40 | 43 | 52
基于此数据:
id | avg_heat_demand | year
----+-----------------+------
11 | 55 | 2015
12 | 40 | 2015
11 | 45 | 2025
12 | 43 | 2025
11 | 50 | 2050
12 | 52 | 2050
(6 Zeilen)
尝试使用子查询:
SELECT
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2015) AS avg_2015,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2025) AS avg_2025,
(SELECT AVG(avg_heat_demand) FROM simulation_output WHERE year = 2050) AS avg_2050;
avg_2015 | avg_2025 | avg_2050
---------------------+---------------------+---------------------
47.5000000000000000 | 44.0000000000000000 | 51.0000000000000000
(1 Zeile)
如果您能负担得起多行结果,请尝试以下查询:
SELECT year,AVG(avg_heat_demand)
FROM simulation_output
GROUP BY year
ORDER BY year
year | avg
------+---------------------
2015 | 47.5000000000000000
2025 | 44.0000000000000000
2050 | 51.0000000000000000
(3 Zeilen)
EDIT:基于 OP 的编辑(不同的所需输出格式)
SELECT DISTINCT i.id,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2015 AND j.id = i.id) AS avg_heat_demand_2015,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2025 AND j.id = i.id) AS avg_heat_demand_2025,
(SELECT avg_heat_demand FROM simulation_output j WHERE year=2050 AND j.id = i.id) AS avg_heat_demand_2050
FROM simulation_output i
id | avg_heat_demand_2015 | avg_heat_demand_2025 | avg_heat_demand_2050
----+----------------------+----------------------+----------------------
11 | 55 | 45 | 50
12 | 40 | 43 | 52
(2 Zeilen)
我知道找到了使用交叉表功能的解决方案:
SELECT *
FROM crosstab('select id, year, avg_heat_demand FROM simulation_output order by 1,2')
AS final_result(id character varying, avg_heat_demand_m2_2015 double precision, avg_heat_demand_m2_2025 double precision, avg_heat_demand_m2_2050 double precision);
所述