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 のすべてのデータである場合、1990 年から 2005 年の市 54 の従業員数を表示したい場合、クエリ結果としてこれを表示します。

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 クエリはありますか? 私が考えることができるのは、数値を取得したい年ごとに 1 つのクエリを持つ、一連の 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 に答える