KDB 排除具有空值的行
KDB Excluding rows that have nulls
我有一个 table,其中有少量具有空值的单元格(分散在整个数据集中)。有什么简单的方法可以排除所有列中有空值的行吗?
我只是想避免这种情况...
select from T where not null col1, not null col2, not null col3, etc...
要么使用简单的列表函数以便于阅读代码
或速度的函数形式。
函数形式会更快,因为它不会扫描所有整列,只扫描那些通过过滤器每个阶段的列。
q)t:flip `a`b`c`d`e!flip {5?(x;0N)} each til 10
q)t
a b c d e
---------
0 0
1 1
2 2 2
3 3 3 3
4 4 4 4 4
5 5
6
7 7
8 8
9 9 9 9
// simple way
q)where all each not null t
,4
q)t where all each not null t
a b c d e
---------
4 4 4 4 4
// faster
q)?[t;{(not;(null;x))} each cols t; 0b; ()]
a b c d e
---------
4 4 4 4 4
添加到 Ryan 的回答中......如果你的 table 有字符串(嵌套)列,那么你需要稍微修改函数形式:
q)tab:([] col1:`a`b`c`d;col2:1 0N 3 0N;col3:"v vv";col4:0n 1.0 2.0 3.0;col5:("";"";"rf";"er"))
q)tab
col1 col2 col3 col4 col5
------------------------
a 1 v ""
b 1 ""
c 3 v 2 "rf"
d v 3 "er"
然后使用零计数作为空字符串的指示符:
q)?[`tab;not,'enlist each @[(null;0=count');"C"=exec t from meta tab],'cols tab;0b;()]
col1 col2 col3 col4 col5
------------------------
c 3 v 2 "rf"
我有一个 table,其中有少量具有空值的单元格(分散在整个数据集中)。有什么简单的方法可以排除所有列中有空值的行吗?
我只是想避免这种情况...
select from T where not null col1, not null col2, not null col3, etc...
要么使用简单的列表函数以便于阅读代码 或速度的函数形式。 函数形式会更快,因为它不会扫描所有整列,只扫描那些通过过滤器每个阶段的列。
q)t:flip `a`b`c`d`e!flip {5?(x;0N)} each til 10
q)t
a b c d e
---------
0 0
1 1
2 2 2
3 3 3 3
4 4 4 4 4
5 5
6
7 7
8 8
9 9 9 9
// simple way
q)where all each not null t
,4
q)t where all each not null t
a b c d e
---------
4 4 4 4 4
// faster
q)?[t;{(not;(null;x))} each cols t; 0b; ()]
a b c d e
---------
4 4 4 4 4
添加到 Ryan 的回答中......如果你的 table 有字符串(嵌套)列,那么你需要稍微修改函数形式:
q)tab:([] col1:`a`b`c`d;col2:1 0N 3 0N;col3:"v vv";col4:0n 1.0 2.0 3.0;col5:("";"";"rf";"er"))
q)tab
col1 col2 col3 col4 col5
------------------------
a 1 v ""
b 1 ""
c 3 v 2 "rf"
d v 3 "er"
然后使用零计数作为空字符串的指示符:
q)?[`tab;not,'enlist each @[(null;0=count');"C"=exec t from meta tab],'cols tab;0b;()]
col1 col2 col3 col4 col5
------------------------
c 3 v 2 "rf"