如果上一个值为空,如何获取下一个值的下一个
Posted
技术标签:
【中文标题】如果上一个值为空,如何获取下一个值的下一个【英文标题】:How to get the next next to last value if previous value is null 【发布时间】: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 的行出现在具有%
类型的任何给定行之前和之后?请记住,表本质上是无序集。
【参考方案1】:
您不需要lag()
。只需使用max()
:
select ID, number, type,
max(number) over (partition by id) as new_number
from tbl
order by ID;
只填充了一个值,因此您甚至不需要NOT NULL
比较。
【讨论】:
我实际上也尝试过,但不幸的是它不适用于我的数据集。它只返回每个 ID 的最大值,但 Number 需要按类型是唯一的。例如,数据集有 74 条记录,它们共享相同的 ID '22',但每种类型都有一个唯一的编号。我需要按类型填写数字。 @MrMuffin 。 . .这适用于您的示例数据和您拥有的描述。我建议您提出一个新问题,并更清楚地了解规则和示例数据。 感谢您的建议。刚刚上传了示例结果供您参考。以上是关于如果上一个值为空,如何获取下一个值的下一个的主要内容,如果未能解决你的问题,请参考以下文章