标记前两个具有组中值的原始

时间:2017-04-06 10:58:40

标签: sql oracle plsql oracle-sqldeveloper qsqlquery

首先,我不是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的日子应该是02/03/2017&amp; 2017/03/06我已将结果上传到google drive链接下方

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

2 个答案:

答案 0 :(得分:1)

这个逻辑:

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

枚举每个的行,而不是每个。如果您希望每月前两个,那么您需要更改partition by子句:

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

答案 1 :(得分:0)

基本上,您需要在就业,月份上Row_number记录分区,并在晚期和正常情况下分开(请参阅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