首先,我不是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
答案 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