更新oracle sql中的倒数第二个记录

时间:2013-04-27 06:25:10

标签: sql oracle top-n

我有3个主键。 CompanyName,EmpNo,StartDate。

我想创建一个存储过程,允许我只更新每个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

3 个答案:

答案 0 :(得分:0)

假设你想要什么,你可以通过这个获得每个empno /公司的第二个最终命运

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)

答案 1 :(得分: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'

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

答案 2 :(得分:-2)

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