函数式形式下SUM为何未忽略NULL值?
KDB+函数式Select逐行求和处理NULL问题
问题根源
- sum遇NULL返回NULL:KDB+里
sum函数默认碰到NULL就直接返回NULL,不会自动把NULL当0算,和你理解的文档描述有出入。 - sum/是全局求和:
sum/是归约操作,会把所有行的指定列数据全加起来,自然得到的是全局总和,不是逐行计算的结果。
解决办法
要实现逐行对多列求和且把NULL视为0,可以用下面两种方式修改函数式select的参数:
方法1:先把NULL替换成0,再逐行求和
用0^把列里的NULL换成0,再配合sum each逐行处理列列表:
a: (enlist col)!enlist(sum each; 0^(enlist,`dealsA`dealsB`dealsC))
0^会将每列中的NULL替换为0,避免求和时出现NULL结果sum each针对每行的三列值执行求和,实现逐行计算
方法2:用sum skip忽略NULL(效果等价于视NULL为0)
sum skip会自动跳过NULL值求和,和把NULL当0算的效果一样,再加上each逐行执行:
a: (enlist col)!enlist(sum skip each; enlist,`dealsA`dealsB`dealsC)
验证示例
假设测试表如下:
t: ([] dealsA: 1 2 NULL; dealsB: NULL 3 4; dealsC: 5 NULL 6)
用方法1的函数式查询:
select a: sum each 0^(dealsA,dealsB,dealsC) from t
返回结果:
a --- 6 5 10
完全符合逐行求和且NULL视为0的预期。
内容的提问来源于stack exchange,提问作者vicefreak04
相关产品推荐
相关产品推荐

