Sql 在Postgres中按月检索活跃员工

Sql 在Postgres中按月检索活跃员工,sql,postgresql,Sql,Postgresql,在我的员工数据库中,我有一个列hire\u date,其中包含员工的招聘日期,还有一个列deactivate\u date,其中包含员工被解雇的日期(如果员工仍然在职,则为空) 要查找任何月初的在职员工人数,我可以运行以下查询。例如,在2019年1月1日查看我的在职员工- SELECT count(*) FROM employees WHERE hire_date <= '2019-01-01' AND (deactivate_date IS NULL OR deactivate_dat

在我的员工数据库中,我有一个列
hire\u date
,其中包含员工的招聘日期,还有一个列
deactivate\u date
,其中包含员工被解雇的日期(如果员工仍然在职,则为空)

要查找任何月初的在职员工人数,我可以运行以下查询。例如,在2019年1月1日查看我的在职员工-

SELECT count(*) 
FROM employees
WHERE hire_date <= '2019-01-01' AND
(deactivate_date IS NULL OR deactivate_date > '2019-01-01')
选择计数(*)
来自员工
出租地点(日期“2019-01-01”)
现在,我想知道的是2018年每个月1日的在职员工人数。显然,我可以运行这个查询12次,但我想知道是否有更有效的解决方案。pg的
交叉表
生成序列
函数似乎很有用,但我还没有形成正确的查询

使用
生成_系列()

选择gs.dte,计数(e.HERE\U日期)
从生成_系列('2018-01-01':日期,'2018-12-01':日期,间隔'1个月')gs(dte)左连接
雇员
在e.hire_日期(通用dte)
G.dte分组
由gs.dte订购;
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;