Sql 将列中具有相同值的连续行减少为一行

Sql 将列中具有相同值的连续行减少为一行,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我正在尝试创建一个生物识别考勤系统,该系统接收来自生物识别设备的数据 从设备接收的考勤表的结构如下所示 这个表最初有很多包含多个emp_no的数据,但我创建了一个存储过程,用于提取一个员工在特定日期的详细信息,如上图所示。 现在面临的挑战是,我需要分析这个表并重新构造它(重新创建另一个表),以便它具有交替的签入和签出(每个签入之后必须有一个签出,反之亦然)以及 连续签入,我应该选择较早的,而连续签出,我应该选择最新的。 任何关于如何进行这项工作的想法都将不胜感激。 谢谢。使用窗口函数lag()

我正在尝试创建一个生物识别考勤系统,该系统接收来自生物识别设备的数据

从设备接收的考勤表的结构如下所示

这个表最初有很多包含多个emp_no的数据,但我创建了一个存储过程,用于提取一个员工在特定日期的详细信息,如上图所示。 现在面临的挑战是,我需要分析这个表并重新构造它(重新创建另一个表),以便它具有交替的签入和签出(每个签入之后必须有一个签出,反之亦然)以及 连续签入,我应该选择较早的,而连续签出,我应该选择最新的。 任何关于如何进行这项工作的想法都将不胜感激。
谢谢。

使用窗口函数
lag()
lead()


使用窗口函数
lag()
lead()


最好将样本数据表示为。有关如何创建美观的表的一些提示,请参阅。示例数据最好显示为。有关如何创建美观表格的一些提示,请参阅。感谢您的快速回复,。我将继续阅读更多有关windows功能的内容。但是,我实际上想实现的是,如果有两个或更多连续的签入,它应该只接受第一个,而忽略另一个,。如果有连续的签出,它应该选择最新的签出,而忽略其余的,。因此,生成的表应该具有较少的交替签入和签出记录。好的,请参阅更新的答案。在问题中列出预期结果可能有助于避免误解。并始终以文本形式提供数据结构和示例数据。我仍在学习如何在StackOverflow中编写和构造我的答案,对此表示抱歉。非常感谢,我已经用了一整天了,到现在都没有用。似乎我有必要通过“窗口函数”来掌握这些概念。出于好奇,是否有一种方法可以重新构造生成的表,使其不具有交替签入和签出的状态列,而应该具有具有各自时间的签入和签出列?请参阅。感谢您的快速响应,。我将继续阅读更多有关windows功能的内容。但是,我实际上想实现的是,如果有两个或更多连续的签入,它应该只接受第一个,而忽略另一个,。如果有连续的签出,它应该选择最新的签出,而忽略其余的,。因此,生成的表应该具有较少的交替签入和签出记录。好的,请参阅更新的答案。在问题中列出预期结果可能有助于避免误解。并始终以文本形式提供数据结构和示例数据。我仍在学习如何在StackOverflow中编写和构造我的答案,对此表示抱歉。非常感谢,我已经用了一整天了,到现在都没有用。似乎我有必要通过“窗口函数”来掌握这些概念。出于好奇,是否有一种方法可以重新构造生成的表,使其不具有交替签入和签出的状态列,而应该具有具有各自时间的签入和签出列?请参阅。
select emp_id, att_date, att_time, status
from (
    select 
        emp_id, att_date, att_time, status, 
        case 
            when status = 'checkin' then lag(status) over w is distinct from 'checkin'
            else lead(status) over w is distinct from 'checkout'
        end as visible
    from my_table
    window w as (partition by emp_id, att_date order by att_time)
    ) s
where visible