【问题标题】:Data value on a given date给定日期的数据值
【发布时间】:2021-10-13 22:28:41
【问题描述】:

这次我在 PostgreSQL 数据库上有一个表,其中包含员工姓名、他开始工作的日期和他离开公司的日期,在员工仍然留在公司的情况下,该字段为空价值。 知道了这一点,我想知道有多少人在预定日期工作,例如:

我想知道 2021 年 1 月有多少人在公司工作。

我不知道从哪里开始,在某些尝试中,我得到了每月的招聘和裁员数量,但我需要在另一列中显示每月的累计值。

我希望我自己理解了,我将把我得到的最后一条 SQL 留在这里。

select reference, sum(hires) from
(
select 
    date_trunc('month', date_hires) as reference,
    count(*) as hires   
from
    ponto_mais_relatorio_colaboradores
group by 
    date_hires
union all

select  
    date_trunc('month', date_layoff) as reference,
    count(*)*-1 as layoffs
from 
    ponto_mais_relatorio_colaboradores
group by 
    date_layoff    
) as reference

join calendar_aux on calendar_aux.ano_mes = reference

group by reference
order by reference

【问题讨论】:

    标签: sql postgresql metabase


    【解决方案1】:

    分解需求。问题:在任何给定日期有多少人被雇用?这将包括在该日期之前聘用且没有裁员日期的所有员工,以及之前聘用且裁员日期晚于您感兴趣的日期的所有员工。即,您对 Jan 感兴趣,因此您仍然想计算 2 月裁员日期的员工。将其转换为 SQL。上述内容可从选择的比较日期中获得。另一个问题是 Jan 不是日期,它是一个日期范围,所以你需要每个日期。您可以使用生成系列来创建一月的每一天。然后将生成的日期与表中的选择相结合。结果查询:

    with jan_dates( jdate ) as  
         ( select generate_series( date '2021-01-01' 
                                 , date '2021-01-31'
                                 , interval '1' day 
                                 )::date
         )
     select jdate "Date", count(*) "Employees"
       from jan_dates j 
       join employees e 
         on (    e.date_hires <= j.jdate
             and (   e.date_layoff is null
                  or e.date_layoff > j.jdate
                 )
            )
     group by j.jdate
     order by j.jdate;     
    

    注意:未经测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多