根据最大值为字母数字情况分配数值

问题描述 投票:0回答:1

我有一张桌子如下

身份证 版本 城市 注释
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...)
,但也没有给出预期的结果。请在这里指导我。

sql max sql-server-2019
1个回答
2
投票

我们可以使用窗口函数

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

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.