基于现有值创建列并将逻辑应用于某些值 - 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的主要内容,如果未能解决你的问题,请参考以下文章
pyspark 数据帧上的复杂逻辑,包括前一行现有值以及动态生成的前一行值
如何比较两个表的列并将值插入到基于 SQL Server 中存储过程中的比较的新表中