我有一张桌子如下
身份证 | 版本 | 城市 | 注释 |
---|---|---|---|
101 | 1 | 瑞典 | 01 |
101 | 1 | 柏林 | 20 |
101 | 1 | 东京 | AAB |
101 | 1 | 德里 | C23 |
101 | 1 | 德班 | 34 |
101 | 2 | 柏林 | 0 |
101 | 2 | 梵蒂冈 | AB |
101 | 2 | 墨西哥 | 329 |
预期产量
身份证 | 版本 | 城市 | 注释 |
---|---|---|---|
101 | 1 | 瑞典 | 01 |
101 | 1 | 柏林 | 20 |
101 | 1 | 德班 | 34 |
101 | 1 | 东京 | 44 |
101 | 1 | 德里 | 54 |
101 | 2 | 柏林 | 0 |
101 | 2 | 墨西哥 | 329 |
101 | 2 | 梵蒂冈 | 330 |
逻辑 每当我发现数字 [0-9] 以外的值时,我必须获取特定组(ID、版本)中的最大值,并将所有剩余行的值递增 10。如果我们看到第一组(101,1),我有 2 行字母数字。所以我必须取最大值 34 并为剩余的每一行增加 10(44 和 54 - 剩余行的顺序无关紧要)。
我已经尝试过以下代码
select ID,Version,
MAX(case when ISNUMERIC(Notes)=1 then Notes+10 end) OVER (PARTITION BY ID, Version ORDER BY City)
FROM MYTABLE
但是这会为所有剩余行返回相同的值(44)。我也尝试过
ROW_NUMBER()..+MAX(Case...)
,但也没有给出预期的结果。请在这里指导我。
我们可以使用窗口函数
MAX()
和 SUM()
来实现这一点:
SELECT ID, Version, City,
CASE WHEN ISNUMERIC(Notes) = 0
THEN ISNULL(max_Notes, 0) + sum(step) OVER (PARTITION BY ID, Version ORDER BY City)
ELSE Notes
END AS Notes
FROM (
SELECT *, max(CASE WHEN ISNUMERIC(Notes)=1 THEN Notes END) OVER (PARTITION BY ID, Version) AS max_Notes,
CASE WHEN ISNUMERIC(Notes)=0 THEN 10 END AS step
FROM MYTABLE
) as s
ORDER BY ID, Version, City;
子查询将获取每组中的最高音符,并为每个字母数字值分配顺序步骤,而外部查询将根据最大音符和步骤的运行总计来计算每个字母数字行的音符。
适用于该数据集:
INSERT INTO mytable VALUES
(101, 1, 'Sweden', '01'),
(101, 1, 'Berlin', '20'),
(101, 1, 'Tokyo', 'AAB'),
(101, 1, 'Delhi', 'C23'),
(101, 1, 'Durban', '34'),
(101, 2, 'Berlin', '0'),
(101, 2, 'Vatican', 'AB'),
(101, 2, 'Mexico', '329'),
(101, 3, 'New york', 'AC'),
(101, 3, 'Paris', 'AB');
结果:
ID Version City Notes
101 1 Sweden 1
101 1 Berlin 20
101 1 Durban 34
101 1 Delhi 44
101 1 Tokyo 54
101 2 Berlin 0
101 2 Mexico 329
101 2 Vatican 339
101 3 New york 10
101 3 Paris 20