我有一张值表。每个值可以具有1个或多个条目,但任何时候都只有1个处于活动状态。该表具有主要的INT ID
我需要一种方法来使“当前”值无效,并使“下一个”值有效。如果当前有效值是最后一个有效值,则使第一个值有效。只有1个条目的值将始终处于活动状态。
序列应如下所示
有人能提供实现这一目标的方法吗?
答案 0 :(得分:1)
您不应在单独的列中显示运行。您的数据应将此信息放在单独的行中。因此,您的数据在每次运行时都应具有一组单独的行:
id value run active
1 Apple 1 1
2 Apple 1 0
3 Apple 1 0
4 Banana 1 1
5 Banana 1 0
6 Cherry 1 1
1 Apple 2 0
2 Apple 2 1
3 Apple 2 0
4 Banana 2 0
5 Banana 2 1
6 Cherry 2 1
您可以添加下一个运行方式:
with r as
select t.*, max(run) over () as max_run,
row_number() over (partition by run, value order by id) as seqnum,
lag(active) over (partition by run, value order by id) as prev_active
from runs
)
insert into runs (id, value, run, active)
select id, value, max_run + 1,
(case when prev_active = 1 then 1
when prev_active is null or seqnum = 1 then 1
else 0
end) as active
from r
where run = max_run;
答案 1 :(得分:0)
只需进行检查,即从表中选择的id不是该表的max(id),然后将日志更新为非活动状态,然后将id + 1更新为活动状态。 如果表中的选择ID为max(ID),则只需将该行更新为非活动状态,并将min(ID)更新为活动状态。
构建查询,这很有趣。