2017-04-06 60 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 
相關問題