有约束的按组添加序号

Add sequence number by group with constraint

我有一个Demotable

CREATE TABLE `Demo` (
  `id` int(11) NOT NULL,
  `seq` int(11) NOT NULL,
  `old_status` int(11) NOT NULL,
  `new_status` int(11) NOT NULL
)

...和演示数据

INSERT INTO `Demo` (`id`, `seq`, `old_status`, `new_status`) VALUES
(1, 1, 1, 2),
(1, 2, 2, 3),
(1, 3, 3, 9),
(1, 4, 9, 2),
(1, 5, 2, 3),
(2, 1, 1, 2),
(2, 2, 2, 3);

Demotable长得像

id seq old_status new_status
1 1 1 2
1 2 2 3
1 3 3 9
1 4 9 2
1 5 2 3
2 1 1 2
2 2 2 3

我想添加一个按组保存版本的列,条件是如果我们满足 new_status = 9,则每组 id 将前一个增加一个。 预期结果:

id seq old_status new_status _version
1 1 1 2 1
1 2 2 3 1
1 3 3 9 2
1 4 9 2 2
1 5 2 3 2
2 1 1 2 1
2 2 2 3 1

我尝试使用 LAG 函数来获取我的结果,但出了点问题!

SELECT id, old_status, new_status, 
case 
    when new_status <> 9 then Lag(_version, 1) Over(PARTITION by id ORDER by seq) 
    else Lag(_version, 1) Over(PARTITION by id ORDER by seq) + 1
end _version
from 
(select id, old_status, new_status, 1 as _version, seq
from Demo
order by id, seq) result

如何直接在存在的 _version 列上计算 _version 或者是否有其他方法。

我认为您无法从计算列执行此操作,但您可以在此处使用 SUM() 作为分析函数:

SELECT *, SUM(new_status = 9) OVER (PARTITION BY id ORDER BY seq) + 1 AS _version
FROM Demo
ORDER BY id, seq;