我有一组数据,列出了在许多城市的某个类型的部门中雇用的每个员工,并列出了每个员工的开始和结束日期。
例如:
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
我想要的是每个城市在特定时期内每年的员工人数。例如,如果这是城市54的所有数据,那么如果我想显示城市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
(请注意,我会有很多城市,所以这里的主键是城市和年份,除非我想要一个单独的id列。)
是否有高效的SQL查询来执行此操作?我能想到的只是一系列UNIONed查询,每年都有一个查询,我想得到数字。
我的数据集有几百个城市和178,000个员工记录。我需要在我的数据集中为每个城市找到几十年的年度数据。
答案 0 :(得分:1)
用您的参数
替换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
<强> sql fiddle demo 强>