我们正在使用Oracle v12 +
我们有一种情况,每当每个status
有第一个RENEW
时,我们就需要更新ID
列为先前的值(它是功能ID,并且有许多行针对一个ID)。
请参见下面的示例I / O。每个ID的数据均按时间戳排序。
我们需要特定的联接进行更新吗?为此,我已将数据复制到临时表中,但没有成功。
表名:table_book_status
Input
[id] [word] [status] [timestamp]
B000JMLBHU book RENEW
B000JMLBHU read RENEW
B000JMLBHU was MODIFY
B000JMLBHU story ADD
B000R93D4Y with RENEW
B000R93D4Y book RENEW
B000R93D4Y story RENEW
B000R93D4Y was MODIFY
B000R93D4Y have ADD
B001892DGG was ADD
B001892DWA was ADD
B001BXNQ2O was RENEW
B001BXNQ2O book RENEW
B001H55R8M was MODIFY
B001HQHCBQ was ADD
B001HQHCBQ story ADD
B001HQHCBQ bella ADD
B001HQHCBQ with ADD
B001HQHCBQ love ADD
B001HQHCBQ zsadist ADD
Output
[id] [word] [status] [timestamp]
B000JMLBHU book RENEW
B000JMLBHU read **MODIFY**
B000JMLBHU was MODIFY
B000JMLBHU story ADD
B000R93D4Y with RENEW
B000R93D4Y book RENEW
B000R93D4Y story **MODIFY**
B000R93D4Y was MODIFY
B000R93D4Y have ADD
B001892DGG was ADD
B001892DWA was ADD
B001BXNQ2O was RENEW
B001BXNQ2O book **ADD**
B001H55R8M was MODIFY
B001HQHCBQ was ADD
B001HQHCBQ story ADD
B001HQHCBQ bella ADD
B001HQHCBQ with ADD
B001HQHCBQ love ADD
B001HQHCBQ zsadist ADD
您可以如下使用lag
和sum
窗口功能:
select id, word,
case when sm = 1 and status = 'Renew'
then coalesce(lgst, 'Add')
end as status,
timestamp
from
(select id, word, status,
sum(case when status = 'Renew' then 1 else 0 end) over (partition by id order by timestamp) as sm,
lag(status) over (partition by id order by timestamp) as lgst, timestamp
from your_table)