有约束的按组添加序号
Add sequence number by group with constraint
我有一个Demo
table
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);
Demo
table长得像
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;
我有一个Demo
table
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);
Demo
table长得像
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;