2012-06-09 58 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小提琴。如此简单而有效! –