我有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
答案 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访问倒数第二行,获取主键值并正确更新。