2013-09-30 91 views
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 

(请注意,我将有很多城市,所以这里的主键将是城市和年份,除非我想拥有一个单独的ID列。)

有没有一个有效的SQL查询来做到这一点?我能想到的只是一系列UNIONed查询,每年我都想查询一个数字。

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

回答

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

+0

谢谢!我不知道'generate_series'。有一点需要注意的是,用count(*)'可以缩短查询时间并产生相同的结果。我还修改了通过将城市ID添加到“GROUP BY”子句中,删除'和t.city_id = ',并将所有占位符''替换为SELECTed列中的't.city_id',从而对所有城市进行了修改。 –

相关问题