Sql 获取具有开始日期和结束日期的每年数据计数

Sql 获取具有开始日期和结束日期的每年数据计数,sql,postgresql,date,union,Sql,Postgresql,Date,Union,我有一组数据,列出了在许多城市某一部门工作过的每位员工,并列出了每位员工的开始和结束日期 例如: name city_id start_date end_date ----------------------------------------- Joe Public 54 3-19-1994 9-1-2002 Suzi Que 54 10-1-1995 9-1-2005 我想要的是每个城市在特定时期内每年的员工数量。例如,如果这是ci

我有一组数据,列出了在许多城市某一部门工作过的每位员工,并列出了每位员工的开始和结束日期

例如:

name        city_id  start_date  end_date
-----------------------------------------
Joe Public  54       3-19-1994   9-1-2002
Suzi Que    54       10-1-1995   9-1-2005
我想要的是每个城市在特定时期内每年的员工数量。例如,如果这是city 54的所有数据,那么如果我想显示city 54 1990-2005年的员工数量,我会将其显示为查询结果:

city_id  year  employee_count
-----------------------------
54       1990  0
54       1991  0
54       1992  0
54       1993  0
54       1994  1
54       1995  2
54       1996  2
54       1997  2
54       1998  2
54       1999  2
54       2000  2
54       2001  2
54       2002  2
54       2003  1
54       2004  1
54       2005  1
(请注意,我将有许多城市,因此这里的主键是city和year,除非我想有一个单独的id列。)

是否有一个有效的SQL查询来实现这一点?我所能想到的就是一系列联合查询,每年我都要查询一次我想要的号码


我的数据集有几百个城市和178000份员工记录。我需要在我的数据集中找到每个城市几十年的年度数据。

用您的参数替换
54

select
    <city_id>, c.y, count(t.city_id)
from generate_series(1990, 2005) as c(y)
    left outer join Table1 as t on
          c.y between extract(year from t.start_date) and extract(year from t.end_date) and
          t.city_id = <city_id>
group by c.y
order by c.y
选择
,c.y,count(t.city_id)
从生成_系列(1990、2005)为c(y)
左外连接表1为t on
c、 摘录(从t.开始日期算起的年份)和摘录(从t.结束日期算起的年份)之间的y和
t、 城市标识=
c.y.集团
c.y.订购

用参数替换
54

select
    <city_id>, c.y, count(t.city_id)
from generate_series(1990, 2005) as c(y)
    left outer join Table1 as t on
          c.y between extract(year from t.start_date) and extract(year from t.end_date) and
          t.city_id = <city_id>
group by c.y
order by c.y
选择
,c.y,count(t.city_id)
从生成_系列(1990、2005)为c(y)
左外连接表1为t on
c、 摘录(从t.开始日期算起的年份)和摘录(从t.结束日期算起的年份)之间的y和
t、 城市标识=
c.y.集团
c.y.订购

谢谢!我不知道
generate_series
。需要注意的是,使用
count(*)
可以缩短查询,并生成相同的结果。我还修改了将城市id添加到
GROUP by
子句,删除
和t.city\u id=
,并在所选列中将占位符
替换为
t.city\u id
,以计算我的所有城市。谢谢!我不知道
generate_series
。需要注意的是,使用
count(*)
可以缩短查询,并生成相同的结果。我还修改了将城市id添加到
GROUP by
子句,删除
和t.city\u id=
,并在所选列中将占位符
替换为
t.city\u id
,从而计算我的所有城市。