检查员工是否连续三天在场

时间:2018-01-09 00:38:15

标签: sql postgresql

我有一个名为tbl_A的表,其中包含以下架构:

tbl_A Schema

插入后,我在tbl_A中有以下数据:

Available data

现在的问题是如何为以下场景编写查询:

  • 将(1)放在任何连续三天在场的员工面前
  • 将(0)放在连续三天不在场的员工面前

输出屏幕拍摄:

output

我认为我们应该使用案例陈述,但我无法连续三天检查。我希望我能在这方面得到帮助

谢谢

3 个答案:

答案 0 :(得分:1)

select name, case when max(cons_days) >= 3 then 1 else 0 end as presence
from (
  select name, count(*) as cons_days
  from tbl_A, (values (0),(1),(2)) as a(dd)
  group by name, adate + dd
)x
group by name

答案 1 :(得分:0)

nameavailable = 'Y'上进行自我加入后,我们会为给定的name创建一个包含不同日期组合的内部表,并计算日期中的日期该表的两个实例相距少于2个单位,即对于日期adate的每个值,它将检查具有自己的值adate以及adate + 1和{的条目{1}}。如果所有3个条目都存在,则计数将为adate + 2,并且对于此类3,您将拥有值为1的标记(这在外部查询中完成)。请尝试以下查询:

names

由于问题的复杂性,我无法测试它。如果出现问题,请告诉我,我很乐意回答。

答案 2 :(得分:0)

--Below is My Approch

select Name,
       Case WHen Max_Count>=3 Then 1 else 0 end as Presence
from 
(
    Select Name,MAx(Coun) as Max_Count
    from 
  (
      select Name, (count(*) over (partition by Name,Ref_Date)) as Coun from
      (
        select  Name,adate + row_number()  over (partition by Name order by Adate  desc) as Ref_Date
        from temp
        where available='Y'
       )
  ) group by Name
);