oracle SQL中的连续记录

Posted

技术标签:

【中文标题】oracle SQL中的连续记录【英文标题】:Consecutive records in oracle SQL 【发布时间】:2017-02-07 16:58:10 【问题描述】:

我有一个类似的问题想在这里发布。 需要连续缺勤 3 天或以上的员工。假设所有的日子都是工作日,周六/周日/任何其他日子没有假期。

在下表中,我需要结果集中的 20342123 和 20311111。 员工 20311333 已请了 4 次休假,但它们不是连续的。

提前感谢您的帮助。

Emp Id     |  AsofDate      | Comment 
----------------------------------
20342123   |  1-JAN-2017| Absent 
20342123   |  2-JAN-2017| Absent 
20342123   |  3-JAN-2017| Absent
20311111   |  1-JAN-2017| Absent 
20311111   |  2-JAN-2017| Absent 
20311111   |  3-JAN-2017| Absent
20311333   |  5-JAN-2017| Absent
20311333   |  6-JAN-2017| Absent
20311333   |  8-JAN-2017| Absent 
20311333   |  9-JAN-2017| Absent
20322222   |  1-JAN-2017| Absent
20322222   |  2-JAN-2017| Absent

【问题讨论】:

【参考方案1】:

虽然您可以应用“间隙和岛屿”解决方案,但我认为lag()/lead() 对于这个问题更简单:

select distinct emp_id
from (select t.*,
             lead(date) over (partition by empid order by date) as date_1,
             lead(date, 2) over (partition by empid order by date) as date_2
      from t
      where comment = 'Absent'  -- not sure if this is important
     ) t
where date_1 = date + 1 and date_2 = date + 2;

【讨论】:

感谢戈登·林诺夫。我在那里错过了一分。正确的问题是 '3 或更多连续出现...' 。是的,comment = 'Absent' 是必需的,因为其他值也会存在。 @DevadasWagle 。 . .这会连续找到 3 个。因此它会连续找到 3 个或更多。 抱歉,即使连续 3 行也无法正常工作。我知道表中有记录但没有出现在输出中。 Gordon Linoff :我在这里搜索了类似的一个:***.com/questions/31660093/… 但是当我们希望连续出现超过 3 次时,用户也说查询不起作用。 @DevadasWagle 。 . .您的date 列是否可能包含时间组件?

以上是关于oracle SQL中的连续记录的主要内容,如果未能解决你的问题,请参考以下文章

Oracle sql查询按日期对连续记录进行分组

Oracle中获取连续的序列号范围的SQL

Oracle中获取连续的序列号范围的SQL

查找表中每个 ID 的最大连续年份(Oracle SQL)

使用 SQL 中的巧妙语句以连续方式将列值更改为多条记录

oracle 怎么得到一个表中连续ID中断开的ID