0

我有 3 个主键。公司名称、雇员编号、开始日期。

我想创建一个存储过程,它可以让我只更新每个 empno 的倒数第二个记录。我怎样才能做到这一点?在这种情况下,我必须按 empnno 记录,但我只想更新倒数第二个记录,而不管记录的数量是多少;如果我有 100 条记录,我想更新同一 empno 的第 99 条记录。

CompanyNo EmpNo    StartDate   FinalDate 
1           1     1999/01/01   2013/04/26   
1           1     2013/04/17   9999/12/31
1           2     1999/01/0    2013/04/26
1           2     2013/04/17   9999/12/31
1           3     1999/01/01   2013/04/26 
1           3     2013/04/17   9999/12/31

在这种情况下,我只想在 FinalDate 中编辑倒数第二个。这些;

CompanyNo EmpNo    StartDate    FinalDate   
1           1      1999/01/01   2013/04/26  <--- this finaldate field
1           2      1999/01/01   2013/04/26  <--- this finaldate field
1           3      1999/01/01   2013/04/26  <--- this finaldate field
4

3 回答 3

0

假设你想要什么,你可以通过这个获得每个empno / company的第二个最终结果

SELECT empNo FROM 
   (
   SELECT companyName, empNo, rank() over (PARTITION BY companyName,empNo
   ORDER BY FinalDate DESC) as rankings FROM yourTable
       ) WHERE ranking = 2

你可以做任何你需要的更新

  Update yourTable set something = something WHERE empNo IN (  thatQueryAbove)
于 2013-04-27T06:41:51.147 回答
0

我不明白为什么你需要一个存储过程。你所描述的可以用一个语句来完成:

merge into employment emp
using
(
   select CompanyName, 
          empno, 
          startdate, 
          finaldate, 
          row_number() over (partition by CompanyName, EmpNo order by StartDate desc) as rnk
   from employment
) t on (t.companyname = emp.companyname and t.empno = emp.empno and t.startdate = emp.startdate and t.rnk = 2)
when matched then update
     set finaldate = date '2013-04-28';

这会将finaldate这些行的'2013-04-28'

虽然我不得不承认我不明白你真正想要做什么。

于 2013-04-27T08:14:05.347 回答
-2

Oracle在查询中提供了一个名为ROWNUM的伪列。因此,如果您知道数据集的总大小(计算它),您可以使用 ROWNUM 访问倒数第二行,获取主键值并正确更新它。

于 2013-04-27T06:31:54.147 回答