2017-04-06 34 views
0

首先,我不是sql中的专家。这就是为什么寻求帮助。 我有一个oracle视图,其中包含员工考勤记录,包括迟到出勤日。 列:标记前两个原始值在一个组中的值

员工编号,日期,及时,门诊时间,Late_Arrival(如果晚了目前越来越被标记为“1”)

我想标记每个员工拳头一个月两次晚来港定居人士“G”。来自查询。

请帮我这个。

SELECT l.EMP_NO,l.ACCOUNT_DATE,l.IN_TIME,l.OUT_TIME,l.LATE_COMING_15 as 
late_arrival, 
      (case when l.LATE_COMING_15 = 1 and 
      row_number() over (partition by trunc(l.ACCOUNT_DATE),l.LATE_COMING_15 
order by l.IN_TIME 
          ) <= 2 
    then 'G' 
end) as flag 
from LATE_EARLYDEP l 

WHERE trunc(l.ACCOUNT_DATE) >= to_date('&DATE_FROM','dd/MM/yy') AND 
trunc(l.ACCOUNT_DATE) <=to_date ('&DATE_TO','dd/MM/yy') 

order by 1,2` 

但我仍然没有得到所需的结果。作为一个例子,员工编号为0005的flaged天应该是02/03/2017 & 06/03/2017。我已经上传结果低于谷歌驱动器链接

结果https://drive.google.com/open?id=0B6Xw1eXeLyG7M3dtbmJUek5OdG8

回答

1

这个逻辑:

 row_number() over (partition by trunc(l.ACCOUNT_DATE), l.LATE_COMING_15 
         order by l.IN_TIME) 

是枚举行每个天,不是每个个月。如果你想在第一每月2,那么您需要更改partition by条款:

 row_number() over (partition by l.emp_no, trunc(l.ACCOUNT_DATE, 'MON'), l.LATE_COMING_15 
         order by l.IN_TIME) 
+0

还没标记所需的结果。看到下面的谷歌驱动器结果。非常感谢。 https://drive.google.com/open?id=0B6Xw1eXeLyG7MkJPd2lTamRVa2M –

+0

@KavinduAnthony。 。 。我认为这个问题只是'partition by'中缺少'emp_no'。 –

0

基本上你需要Row_number您的记录分区上employy,月和后期和正常情况下分离(见PARTITION BY) 并在帐户日期(根据需要)订购它们。 最后用G纪念那些迟到记录有行号1或2

create table IMLATE as 
select 1 emp_no, to_date('01012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('02012017','ddmmyyyy') ACCOUNT_DATE, 0 late_arrival from dual union all 
select 1 emp_no, to_date('03012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('04012017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual union all 
select 1 emp_no, to_date('01022017','ddmmyyyy') ACCOUNT_DATE, 1 late_arrival from dual; 

with late as (
select EMP_NO, ACCOUNT_DATE, LATE_ARRIVAL, 
ROW_NUMBER() over (partition by EMP_NO, trunc(ACCOUNT_DATE,'MM'), LATE_ARRIVAL order by ACCOUNT_DATE) as rn 
from IMLATE) 
select EMP_NO, ACCOUNT_DATE, LATE_ARRIVAL, 
case when late_arrival = 1 and rn in (1,2) then 'G' end sample_late 
from late 
order by emp_no, ACCOUNT_DATE; 

结果

EMP_NO ACCOUNT_DATE  LATE_ARRIVAL SAMPLE_LATE 
---------- ------------------- ------------ ----------- 
     1 01-01-2017 00:00:00   1 G   
     1 02-01-2017 00:00:00   0    
     1 03-01-2017 00:00:00   1 G   
     1 04-01-2017 00:00:00   1    
     1 01-02-2017 00:00:00   1 G 
相关问题