在我的员工数据库中,我有hire_date
列,其中包含雇员的聘用日期,而deactivate_date
列中,有雇员被解雇的日期(如果雇员仍处于活动状态,则为null )。
要查找每个月初的在职员工数,我可以运行以下查询。例如,要在2019年1月1日看到我在职的员工-
SELECT count(*)
FROM employees
WHERE hire_date <= '2019-01-01' AND
(deactivate_date IS NULL OR deactivate_date > '2019-01-01')
现在,我想知道的是2018年每个月1日的在职员工人数。很明显,我可以运行12次此查询,但是想知道是否有更有效的解决方案。 pg的CROSSTAB
和generate_series
函数似乎很有用,但是我无法形成正确的查询。
答案 0 :(得分:2)
使用generate_series()
:
SELECT gs.dte, count(e.hire_date)
FROM generate_series('2018-01-01'::date, '2018-12-01'::date, interval '1 month') gs(dte) LEFT JOIN
employees e
ON e.hire_date <= gs.dte AND
(e.deactivate_date IS NULL OR e.deactivate_date > gs.dte)
GROUP BY gs.dte
ORDER BY gs.dte;