在Postgres中按月检索在职员工

时间:2019-02-24 20:15:51

标签: sql postgresql

在我的员工数据库中,我有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的CROSSTABgenerate_series函数似乎很有用,但是我无法形成正确的查询。

1 个答案:

答案 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;