我有一张桌子,如下所示

ID Version City Notes
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

预期yields

ID Version City Notes
101 1 Sweden 01
101 1 Berlin 20
101 1 Durban 34
101 1 Tokyo 44
101 1 Delhi 54
101 2 Berlin 0
101 2 Mexico 329
101 2 Vatican 330

逻辑 每当我找到数字[0-9]以外的值时,我必须获得特定组(ID、版本)中的最大值,并将10递增到其余所有行.如果我们看到第一组(101,1),我有2个字母数字行.所以我必须取max,它是34,对于剩余的每一行都递增10(44和54-其余行的顺序并不重要).

我已经try 了以下代码

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, rn)
               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,
            ROW_NUMBER() OVER (PARTITION BY ID, Version ORDER BY City) AS rn
  FROM MYTABLE
) as s
ORDER BY ID, Version, Notes;

子查询将获得每个组中最高的音符,并 for each 字母数字值分配顺序步长,而外部查询将根据最大音符和按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,  'Berlin',   'AB'),
(101,   4,  'Paris',    'AC'),
(101,   4,  'Paris',    '25'),
(101,   4,  '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   Berlin      10
101 3   New york    20
101 4   Paris       25
101 4   Paris       35
101 4   Paris       45

Demo here

Sql相关问答推荐

将SEMI JOIN、ANTI JOIN转换为非连接SQL

如何连接第二个表并将其内容输入到第一个表的单个字段中?

在SQL中将相同且紧挨着的元素进行分组

基于多个字段删除Access中的重复记录,同时保留最低优先级

雅典娜嵌套Json提取液

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

Oracle中的时间戳

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

将伪数据插入Postgres表

如何使用聚合连接两个表

Grafana SQL 模板变量(值、文本)

AdventureWorks 查询

SQL SUM Filter逻辑解释

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

获取上个月和上一年的值

SQL ORACLE - 查找连续天数

根据不同日期标准分配组的逻辑

如何在 postgres 中旋转某些数据字段

Oracle PL/SQL长期运行问题

具有日期时间条件的存储过程