如何从 psql table select 以下内容?

How to select the following things from psql table?

我正在使用 Postgres 解析一些数据。我在名为 Congress 的数据库中有一个名为 person_roles 的 SQL table。此 person_roles table 包含以下列:

我想解析这个 SQL table 并得到以下输出。然后我想将这样的结果导出到一个csv文件中。

我想要的输出 table 应该有以下列:

因为从 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;