2012-06-09 102 views
2

我很難弄清楚如何檢查以前的記錄以查看是否應更新當前記錄。檢查以前的記錄以更新Oracle中的當前記錄

不想使用滯後函數,因爲我不會擁有關於要返回多少記錄的信息。

我有一張包含Employee Raise信息的表。如果在過去6個月內曾經出現過Merit增加PCT大於當前Merit增加的情況,我想在IND字段中放入一個X.目前的記錄是2012/05年的記錄。

 
Emp Action Date  Code  proj PCT Ind 
==================================================== 
123 raise 2012/01 COL  acct 2 
123 raise 2012/01 Merit soft 7 
123 raise 2012/02 Merit Acct 4 
123 Raise 2012/05 merit soft 6  ? 
+0

:請用實例給出更好的解釋。 –

+0

當然,我正在EmployeeRecords表(如上所示)上運行一個查詢,我希望在IND列中看到一個X,如果該員工的PCT值高於當前PCT記錄中的PCT值最近6個月。具有6pct的日期2012/05的記錄將在ind列中得到ax,因爲該2012/01年度該僱員的先前的Merit/Raise記錄爲7.對不清楚這僅僅是查詢並且所有記錄需要如果在過去6個月中有過一次較高的PCT提高,則在查詢中僅返回IND字段X. – Ovile

+0

:謝謝奧維爾你如何識別先前的優點/提升記錄。我在哪些列意味着什麼...它是'emp和proj'? –

回答

2

這不是特別有效,但你可以使用強制方法

UPDATE <<table_name>> a 
    SET ind = 'X' 
WHERE <<date column>> = (SELECT MAX(<<date column>> 
          FROM <<table name>> b 
          WHERE a.emp = b.emp) 
    AND EXISTS(SELECT 1 
       FROM <<table name>> c 
       WHERE a.emp = c.emp 
        AND c.code = 'Merit' 
        AND c.action = 'raise' 
        AND c.pct > a.pct 
        AND c.<<date column>> > sysdate - interval '6' month 
        AND c.rowid != a.rowid); 
+0

:Wow +1的解決方案,這可以完成分析功能? –

+0

哇是對的!謝謝!我看着滯後函數,但我看不到方法。 – Ovile

0

如果你只是在尋找一個查詢,而不是一個更新,這可能工作

Select 
    emp, 
    action, 
    date, 
    code, 
    project, 
    pct, 
    case when max(case when code='Merit' and action='raise' then pct end) 
     over (partition by emp order by date 
     range between interval '6' month preceding and current row 
    ) > pct then 'X' end as ind 
From the_table 

我現在沒有數據庫來對此進行測試,所以我不完全確定這會起作用,但認爲它應該。 編輯:解決了如何讓SQL小提琴在我的iPad上運行。這似乎工作,但它會將X放在所有符合條件的行中,而不僅僅是最新的。

+0

非常感謝,太棒了! – Ovile

+0

你在iPad上用sql提琴時遇到了什麼麻煩? (sqlfiddle是我的網站,所以我想盡可能修復它)。 –

+0

@jake我不知道如何選擇甲骨文作爲數據庫時,我第一次看,拿着它肖像。花了我一段時間纔看到右上角的按鈕,而不是通常的下拉菜單,因爲UI與風景或計算機略有不同。部分我也不喜歡使用iPad鍵盤輸入複雜的SQL。我發現我無法複製和粘貼工作,定位光標有點棘手。但兩者都不是主要問題。我非常欣賞SQL小提琴。如此簡單而有效! –