如何从 psql table select 以下内容?
How to select the following things from psql table?
我正在使用 Postgres 解析一些数据。我在名为 Congress 的数据库中有一个名为 person_roles
的 SQL table。此 person_roles
table 包含以下列:
person_id(每个id都是一个人),
类型(参议员或众议员),
start_date(此人开始在国会任职的日期,例如 1789-03-04 或例如 2015-01-06),
end_date(此人结束在国会任职的日期,例如 1791-03-03,或例如 2021-01-03),
州(此人在 his/her 任期内在美国哪个州任职)
政党(民主党、共和党和许多其他政党;请注意,从 1789 年到 2015 年,总共有 4228 人的政党既不是民主党也不是共和党。)
我想解析这个 SQL table 并得到以下输出。然后我想将这样的结果导出到一个csv文件中。
我想要的输出 table 应该有以下列:
年份(从1789年开始到2015年结束:1789年,1790年,...,2014年,2015年)
所有州每年的民主党总人数(包括参议员和众议员)
所有州每年的共和党总人数(包括参议员和众议员)
所有州每年的其他政党人数(参议员和众议员)
因为从 1789 年到 2015 年有 227 年,我想要的输出 table 应该有 227 行。
请注意每年,例如1996年,只要一个人的start_date在今年或今年之前(例如<=1996-12-31),AND his/her end_date在今年或今年之后(e.g.>=1996-01-02) AND his/her start_date <= end_date,则此人将被计为今年(例如1996年)任职的国会议员。
我知道如何在 table 中查找给定年份的民主党或共和党或其他政党的人数。基本上,例如,如果我在 congress=#
中键入以下命令
SELECT COUNT(*) AS numberdem
FROM person_roles
WHERE party = 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberdem
----------------
251
(1 row)
同样,如果我键入以下命令:
SELECT COUNT(*) AS numberrep
FROM person_roles
WHERE party = 'Republican'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberrep
----------------
291
(1 row)
如果我输入:
SELECT COUNT(*) AS numberother
FROM person_roles
WHERE party <> 'Republican'
AND party <> 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberother
-----------------
2
(1 row)
但是,我不知道如何得到一个由 4 列组成的结果 table,其中第一列给出年份(从 1789 年到 2015 年的每一年),第二列给出民主党人数(numberdum) 从 1789 到 2015 的每个特定年份,第 3 列给出了从 1789 到 2015 的每个特定年份的共和党人数 (numberrep),第 4 列给出了从 1789 到 2015 的每个特定年份的其他政党的人数 (numberother) 1789 到 2015。最终,我想将这个 SQL 输出 table 的 227 行(因为从 1789 到 2015 有 227 年)和 4 列导出到 csv 文件。
如何使用 SQL 命令完成这样的任务?如果此任务对于 SQL 不持久,我是否应该从 table person_roles 导出所有数据并将其导出到 Excel csv 并解析 Excel文件代替?
你基本上想复制他们服务的每一年的人,然后以此为基础进行分组,这样你就可以在每一年中计算他们。然后要将计数转换为列,您可以对查找要计算的值的条件语句求和。类似于:
select
year,
sum(case when party = 'Republican' then 1 else 0 end) as republicans,
sum(case when party = 'Democrat' then 1 else 0 end) as democrats,
sum(case when party <> 'Republican' and party <> 'Democrat' then 1 else 0 end) as other
from person_roles p
join generate_series(1789,2015) as s(year)
on year between date_trunc('year', start_date)
and date_trunc('year', end_date)
group by year;
person_roles
的 SQL table。此 person_roles
table 包含以下列:
person_id(每个id都是一个人),
类型(参议员或众议员),
start_date(此人开始在国会任职的日期,例如 1789-03-04 或例如 2015-01-06),
end_date(此人结束在国会任职的日期,例如 1791-03-03,或例如 2021-01-03),
州(此人在 his/her 任期内在美国哪个州任职)
政党(民主党、共和党和许多其他政党;请注意,从 1789 年到 2015 年,总共有 4228 人的政党既不是民主党也不是共和党。)
我想解析这个 SQL table 并得到以下输出。然后我想将这样的结果导出到一个csv文件中。
我想要的输出 table 应该有以下列:
年份(从1789年开始到2015年结束:1789年,1790年,...,2014年,2015年)
所有州每年的民主党总人数(包括参议员和众议员)
所有州每年的共和党总人数(包括参议员和众议员)
所有州每年的其他政党人数(参议员和众议员)
因为从 1789 年到 2015 年有 227 年,我想要的输出 table 应该有 227 行。
请注意每年,例如1996年,只要一个人的start_date在今年或今年之前(例如<=1996-12-31),AND his/her end_date在今年或今年之后(e.g.>=1996-01-02) AND his/her start_date <= end_date,则此人将被计为今年(例如1996年)任职的国会议员。
我知道如何在 table 中查找给定年份的民主党或共和党或其他政党的人数。基本上,例如,如果我在 congress=#
中键入以下命令SELECT COUNT(*) AS numberdem
FROM person_roles
WHERE party = 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberdem
----------------
251
(1 row)
同样,如果我键入以下命令:
SELECT COUNT(*) AS numberrep
FROM person_roles
WHERE party = 'Republican'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberrep
----------------
291
(1 row)
如果我输入:
SELECT COUNT(*) AS numberother
FROM person_roles
WHERE party <> 'Republican'
AND party <> 'Democrat'
AND start_date <= '1996-12-31'
AND end_date >= '1996-01-02'
AND start_date <= end_date;
那我就得到结果:
numberother
-----------------
2
(1 row)
但是,我不知道如何得到一个由 4 列组成的结果 table,其中第一列给出年份(从 1789 年到 2015 年的每一年),第二列给出民主党人数(numberdum) 从 1789 到 2015 的每个特定年份,第 3 列给出了从 1789 到 2015 的每个特定年份的共和党人数 (numberrep),第 4 列给出了从 1789 到 2015 的每个特定年份的其他政党的人数 (numberother) 1789 到 2015。最终,我想将这个 SQL 输出 table 的 227 行(因为从 1789 到 2015 有 227 年)和 4 列导出到 csv 文件。
如何使用 SQL 命令完成这样的任务?如果此任务对于 SQL 不持久,我是否应该从 table person_roles 导出所有数据并将其导出到 Excel csv 并解析 Excel文件代替?
你基本上想复制他们服务的每一年的人,然后以此为基础进行分组,这样你就可以在每一年中计算他们。然后要将计数转换为列,您可以对查找要计算的值的条件语句求和。类似于:
select
year,
sum(case when party = 'Republican' then 1 else 0 end) as republicans,
sum(case when party = 'Democrat' then 1 else 0 end) as democrats,
sum(case when party <> 'Republican' and party <> 'Democrat' then 1 else 0 end) as other
from person_roles p
join generate_series(1789,2015) as s(year)
on year between date_trunc('year', start_date)
and date_trunc('year', end_date)
group by year;