SQL选择下一个值

时间:2018-10-16 08:11:19

标签: sql sql-server

我有一张值表。每个值可以具有1个或多个条目,但任何时候都只有1个处于活动状态。该表具有主要的INT ID

我需要一种方法来使“当前”值无效,并使“下一个”值有效。如果当前有效值是最后一个有效值,则使第一个值有效。只有1个条目的值将始终处于活动状态。

序列应如下所示

Sample Sequence

有人能提供实现这一目标的方法吗?

2 个答案:

答案 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)更新为活动状态。

构建查询,这很有趣。