获取包含开始日期和结束日期的每年数据

时间:2013-09-30 02:32:41

标签: 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

我想要的是每个城市在特定时期内每年的员工人数。例如,如果这是城市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个员工记录。我需要在我的数据集中为每个城市找到几十年的年度数据。

1 个答案:

答案 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