【发布时间】:2019-08-05 22:50:35
【问题描述】:
我正在尝试清理一个基本上填满第一个非空值的所有空值的表。
样本表:
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
我尝试在 sql server 中使用延迟函数。
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”的值为空。
附上我的代码中的示例结果。
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
如您所见,最后一条记录为空,但应为 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 个值?
【问题讨论】:
-
您需要某种方式来对您的行进行排序...您如何判断哪些具有给定 ID 的行出现在具有
%类型的任何给定行之前和之后?请记住,表本质上是无序集。
标签: sql sql-server lag lead