暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 分析和组中的最后一个值,以查找连续的天数 (不包括周末)

ASKTOM 2020-10-07
378

问题描述



create table temp_test (ID NUMBER, DATE_STAMP DATE);

insert into temp_test values (1,to_date('03082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('04082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('05082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('13082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('14082020','ddmmyyyy' ) );
insert into temp_test values (1,to_date('17082020','ddmmyyyy' ) );

The result needs to be:
ID    START_DATE    END_DATE
1      03/08/2020   05/08/2020
1      13/08/2020   17/08/2020


最后日期跨越一个周末,因此在工作日是连续的。

好的,所以ID代表一个人,开始日期和结束日期代表假期。我想说ID1人在3/8/2020和5/8/2020之间有假期,13/8/2020 17/8/2020,而不是说ID1人在3号、4号、5号、13号、14号和8月17日有假期,因为这可能很难阅读和格式化。

专家解答

作为工作日的内容往往会随着时间的推移而变化。特别是,许多企业认为公众假期是非工作日。

因此,我建议创建一个表来存储日期,以及它们是否是一般的非工作日:

create table calendar_dates (
  calendar_date date
    not null
    check ( calendar_date = trunc ( calendar_date ) )
    primary key,
  is_working_day varchar2(1)
    not null
    check ( is_working_day in ( 'Y', 'N' ) )
);

insert into calendar_dates
with rws as (
  select date'2020-07-31' + level dt from dual
  connect by level <= 31
)
  select dt,
         case
           when to_char ( dt, 'dy' ) in ( 'sat', 'sun' ) 
           then 'N'
           else 'Y'
         end 
  from   rws;
  
commit;


从那里,您可以将非工作日期合并到输入的日期。这给你一个范围内的所有日期。因此,将您最喜欢的连续行解决方案应用于此。注意您需要检查每个组的开始是一个工作日。

我已经使用match_regnize这样做了:

with rws as (
  select date_stamp, 'Y' is_working_day
  from   temp_test
  union  all 
  select calendar_date, is_working_day
  from   calendar_dates
  where  is_working_day = 'N'
)
  select * 
  from rws 
    match_recognize (
      order by date_stamp
      measures
        first ( date_stamp ) start_date,
        last ( date_stamp ) end_date
      pattern ( working consecutive* ) 
      define
        working as is_working_day = 'Y',
        consecutive as date_stamp = prev ( date_stamp ) + 1
    );
    
START_DATE              END_DATE               
03-AUG-2020 00:00:00    05-AUG-2020 00:00:00    
13-AUG-2020 00:00:00    17-AUG-2020 00:00:00    


您可以通过在以下位置找到更多有关挑战的信息:https://blogs.oracle.com/sql/how-to-find-the-next-business-day-and-add-or-subtract-n-working-days-with-sql

这个实时SQL脚本讨论match_regnize连续行解决方案 (并显示其他):https://livesql.oracle.com/apex/livesql/file/content_F8P1XASWD667NDOFJTM74NYE9.html
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论