1

我有一组数据,列出了在许多城市的某种类型的部门中曾经雇用过的每位员工,并列出了每位员工的开始和结束日期。

例如:

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

(注意我会有很多城市,所以这里的主键是 city 和 year 除非我想有一个单独的 id 列。)

是否有有效的 SQL 查询来执行此操作?我能想到的只是一系列 UNIONed 查询,我想获得数字的每一年都有一个查询。

我的数据集有几百个城市和 178,000 条员工记录。我需要在我的数据集上为每个城市找到几十年的年度数据。

4

1 回答 1

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

于 2013-09-30T05:49:21.613 回答