我正在尝试清理一个表,该表基本上会填充第一个非空值中的所有空值。
示例表:
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个值?
答案 0 :(得分:3)
您不需要lag()
。只需使用max()
:
select ID, number, type,
max(number) over (partition by id) as new_number
from tbl
order by ID;
仅填充一个值,因此您甚至不需要进行NOT NULL
比较。