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;