如果上一个值为空,如何获取下一个值的下一个

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 。 . .这适用于您的示例数据和您拥有的描述。我建议您提出一个新问题,并更清楚地了解规则和示例数据。 感谢您的建议。刚刚上传了示例结果供您参考。

以上是关于如果上一个值为空,如何获取下一个值的下一个的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Map 函数的下一个元素?

使用 jquery 的 next() 函数获取列表中的下一个元素时,如何在到达列表末尾后获取第一个元素?

如何使用Javascript获取输入值的总和?

如何从 servlet 动态设置/获取复选框的值

MFC如何知道光标在那个控件上 用哪个函数?谢谢

怎样用ThinkPHP在添加数据前获取自增长主键的下一个值