2013-09-30 144 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',從而對所有城市進行了修改。 –

相關問題