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
,从而计算我的所有城市。