Sql 如果上一个值为空,如何获取下一个倒数第二个值
我试图清理一个表,它基本上填充了第一个非空值中的所有空值 示例表:Sql 如果上一个值为空,如何获取下一个倒数第二个值,sql,sql-server,lag,lead,Sql,Sql Server,Lag,Lead,我试图清理一个表,它基本上填充了第一个非空值中的所有空值 示例表: ID Number Type 1 51280 % 1 A 2 51279 % 2 B 3 50631 % 3 A 3 B 3 C 始终为类型“%”填充一个数字,如果存在其他类型,则记录为空。我需要填充类型“%”中的所有空行 最后一张表应如下所示: ID Number Type 1 51280 % 1 51280 A 2 512
ID Number Type
1 51280 %
1 A
2 51279 %
2 B
3 50631 %
3 A
3 B
3 C
始终为类型“%”填充一个数字,如果存在其他类型,则记录为空。我需要填充类型“%”中的所有空行
最后一张表应如下所示:
ID Number Type
1 51280 %
1 51280 A
2 51279 %
2 51279 B
3 50631 %
3 50631 A
3 50631 B
3 50631 C
我尝试在SQLServer中使用lag函数
select ID, number, type,
case when number is not null then number
else lag(number) over (order by id) end as new_number
from tbl
order by ID;
对于除“%”类型之外只有1个类型的记录,它可以正常工作。对于具有多种类型的记录,例如Id 3,它将只填充1条记录。我知道,由于lag()只接受前面的值,因此ID 3的类型“B”只接受类型“A”的数值,而类型“A”的值为null
附加来自我的代码的示例结果
Number Type New_number ID
50201 % 50201 22
NULL COMP 50201 22
50668 % 50668 22
NULL COMP 50668 22
50617 % 50617 22
NULL COMP 50617 22
196794 % 196794 22
NULL COMP 196794 22
1 % 1 22
NULL XO 1 22
NULL COMP NULL 22
如您所见,最后一条记录为null,但它应该为1
我还尝试使用Max()w/o case when condition,但结果只接受该特定id中的最大数字
Number Type new_number ID
50201 % 51827 22
NULL COMP 51827 22
50668 % 51827 22
NULL COMP 51827 22
50617 % 51827 22
NULL COMP 51827 22
196794 % 51827 22
NULL COMP 51827 22
1 % 51827 22
NULL XO 51827 22
NULL COMP 51827 22
有没有办法跳过所有空值,只按类型“%”组获取前1个值?您不需要lag()
。只需使用max()
:
只填充了一个值,因此您甚至不需要进行
notnull
比较。我实际上也尝试过,但不幸的是,它对我的数据集不起作用。它只返回每个ID的最大值,但该数字需要按类型唯一。例如,数据集有74条记录共享相同的ID“22”,但每种类型都有一个唯一的编号。我需要按类型填写这个数字。@Muffin先生。这适用于您的示例数据和描述。我建议你问一个新问题,更清楚地了解规则和样本数据。谢谢你的建议。刚刚上传了示例结果供您参考。您需要一些方法来排序您的行。。。如何判断具有给定ID的行位于具有%
类型的任何给定行之前和之后?请记住,表本身就是无序集。
select ID, number, type,
max(number) over (partition by id) as new_number
from tbl
order by ID;