时间访问SQL查询

时间访问SQL查询,sql,time-and-attendance,Sql,Time And Attendance,我目前正在努力编写SQL查询 这是我的表的外观以及我要从中检索数据的位置: 我想编写一个具有以下结果的查询: 正如您在第一个表中所看到的,员工每天可以签入和签出两次以上。员工首次登记时,日期/时间应放在第一栏“登记”。当他第二次签入时,日期/时间应放在第二列“签出”中。当他第三次签入时,日期/时间应放在“签入”列中,以此类推。如果您的数据库支持窗口功能,则可以执行条件聚合: select employee_id, min(time_in_out) check_in,

我目前正在努力编写SQL查询

这是我的表的外观以及我要从中检索数据的位置:

我想编写一个具有以下结果的查询:


正如您在第一个表中所看到的,员工每天可以签入和签出两次以上。员工首次登记时,日期/时间应放在第一栏“登记”。当他第二次签入时,日期/时间应放在第二列“签出”中。当他第三次签入时,日期/时间应放在“签入”列中,以此类推。

如果您的数据库支持窗口功能,则可以执行条件聚合:

select
    employee_id,
    min(time_in_out) check_in,
    max(time_in_out) check_out
from (
    select t.*, row_number() over(partition by employee_id order by time_in_out) - 1 rn
    from mytable t
) t
group by employee_id, floor(rn / 2) 
order by employee_id, floor(rn / 2)

如果数据库支持窗口函数,则可以执行条件聚合:

select
    employee_id,
    min(time_in_out) check_in,
    max(time_in_out) check_out
from (
    select t.*, row_number() over(partition by employee_id order by time_in_out) - 1 rn
    from mytable t
) t
group by employee_id, floor(rn / 2) 
order by employee_id, floor(rn / 2)

你为什么不为第一个员工再做一次“结账”呢?同时标记您正在使用的数据库。为什么不为第一名员工进行第二次“签出”?同时标记您正在使用的数据库。非常感谢您的帮助。欢迎@TanNguyen。如果我的答案正确回答了您的问题,请单击复选标记。您也可以使用上面的箭头向上投票。您好,GMB,我刚刚测试过,但没有得到预期的结果。@TanNguyen:您能用您的样本数据设置一个吗?您好@GMB,我在最近的问题中添加了结果。非常感谢您的帮助。欢迎@TanNguyen。如果我的答案正确回答了您的问题,请单击复选标记。您也可以使用上箭头向上投票。您好,GMB,我刚刚测试过,但没有给出预期的结果。@TanNguyen:您能用您的样本数据设置一个a吗?您好,GMB,我在最近的问题中添加了结果。