基于现有值创建列并将逻辑应用于某些值 - SQL Server

Posted

技术标签:

【中文标题】基于现有值创建列并将逻辑应用于某些值 - SQL Server【英文标题】:Creating a column based on existing values and applying logics to some - SQL Server 【发布时间】:2020-10-22 12:54:33 【问题描述】:

我真的不知道我必须为标题写什么,因为我无法用一句话来表达 - 提前道歉。

我有一张这样的桌子:

我需要它看起来像这样:

看看我的代码:

select 
    name,
    [sequence] = case
                    when right(left(name, 4), 1) = 'A'
                       then step
                    when right(left(name, 4), 1) = 'B'
                       then -- I'm stuck here. The logic needs to be the maximum of step when right(left(name, 4), 1) was A + step when it was B
                 end,
    value
from
    table 1
where 
    name like 'AM13%'
order by 
    sequence asc

我正在尝试应用这样的逻辑:如果“AM13”之后的第一个字符是“A”,那么就带来步骤,但是如果是 B,那么将步骤添加到 A 的最大值,依此类推。所以我将拥有 1,2,3,4,5,6,7,8,9 而不是 1,2,3,4,1,2,3,1,2

我被困住了!

任何帮助将不胜感激:)

【问题讨论】:

过于复杂? right(left(name, 4), 1) 不只是意味着substring(@x, 4, 1) 吗?也许您的意思是指第 5 个字符(第一行中的 A)而不是第 4 个字符(第一行中的 3 个)? 抱歉,您是对的。子字符串很棒,谢谢:) 【参考方案1】:

对于这个示例数据,row_number() 不就行了吗?

select t.*,
    row_number() over(order by name, step) as sequence
from mytable t
order by name, step

【讨论】:

感谢您的回复!我的实际查询超长并且包含许多连接,所以我担心这种方法的扩展能力。我想过在case指向A时使用变量来捕获最大步长,在B中使用它,但不能。 @P.MAJ:您可以在现有查询中使用row_number(),这非常好。只需输入查询的 select 子句即可。 不幸的是我遇到了问题。如果我取出“where”子句,第 500 行是 AM13 的开始位置,那么序列将是 500 到 509。我需要每个 AM## 以 1 开头。 可以通过函数或存储过程解析吗?【参考方案2】:

好吧,我找到了一个解决方案,并且在一定程度上可行:

select 
    t1.name,
    [sequence] = case
                        when substring(t1.name, 5, 1) = 'A'
                            then t1.step
                        when substring(t1.name, 5, 1) = 'B'
                            then (select
                                      count(t2.name) --or max(t2.name)
                                  from table 1 as t2
                                  where t2.name like concat(LEFT(t1.name, 4), 'A%')) + t1.step
                        else t1.step
                 end,
    value
from
    table 1 as t1
/*where 
    name like 'AM13%'*/
order by 
    sequence asc

【讨论】:

以上是关于基于现有值创建列并将逻辑应用于某些值 - SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

sql 根据具有现有值的其他列创建列

pyspark 数据帧上的复杂逻辑,包括前一行现有值以及动态生成的前一行值

如何比较两个表的列并将值插入到基于 SQL Server 中存储过程中的比较的新表中

将新列添加到现有表中并使用 PL/SQL 中游标中的值更新它们

基于现有列派生其他列

创建新行时的剑道网格,使用现有行中的值自动填充字段