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

时间:2019-08-05 22:50:35

标签: sql sql-server lag lead

我正在尝试清理一个表,该表基本上会填充第一个非空值中的所有空值。

示例表:

if(isset($_POST['isajax'], $_POST['name']) && $_POST['isajax'] == 1) {
    echo $_POST['name'];
    exit; /** no further lines are executed **/
}

'%'类型始终填充一个数字,如果还有其他类型,则记录为空。我需要填写类型'%'中的所有空行。

决赛桌应该像这样:

ID Number Type
1  51280  %
1         A
2  51279  %
2         B
3  50631  %
3         A
3         B
3         C

我尝试在SQL Server中使用滞后函数。

ID Number Type
1  51280  %
1  51280  A
2  51279  %
2  51279  B
3  50631  %
3  50631  A
3  50631  B
3  50631  C

它对于“%”类型之外仅具有1种类型的记录都适用。对于具有多种类型的记录(例如ID 3),将仅填充1条记录。我知道,由于lag()仅采用先前的值,因此ID 3的类型'B'将仅从类型'A'中获取数字值,而类型'A'的值为null。

从我的代码中附加示例结果。

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。

我还尝试在条件不存在的情况下使用Max()w / o情况,但结果仅在该特定ID中使用最大数。


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个值?

1 个答案:

答案 0 :(得分:3)

您不需要lag()。只需使用max()

select ID, number, type,
       max(number) over (partition by id) as new_number
from tbl
order by ID;

仅填充一个值,因此您甚至不需要进行NOT NULL比较。