有效删除包含 null 值的行

Remove rows containing null values efficiently

提问人:foam78 提问时间:3/26/2022 更新时间:3/29/2022 访问量:519

问:

对于包含多行的表,删除包含任何 null 值的行的最有效方法是什么?

此外,为什么我会收到错误

ERROR: 'time (attempt to use variable time without defining/assigning first

尽管在使用功能选择时我没有将其命名为“时间”

?[t;{(not;(null;x))} each cols t; 0b; ()]

在此 S/Oanswer 中给出?

kdb q

评论

2赞 terrylynch 3/26/2022
该错误看起来不像标准的 kdb 错误,它看起来像是有人在您的查询周围放置的错误捕获。您使用的是接口还是 IDE?此外,您的表是内存表还是磁盘表?t
0赞 foam78 3/26/2022
我正在使用 QPad,并且该表在内存中
0赞 terrylynch 3/26/2022
还行。你能给我们看看结果吗?(type t;meta t)
0赞 foam78 3/27/2022
type t退货和退货98hmeta td,p,s,f,j,b
1赞 foam78 3/28/2022
解决了不寻常的时间错误:我只是有一个错别字,用另一个字符替换了功能选择中的一个 t。

答:

2赞 SJT 3/28/2022 #1

您的表是在内存中还是在磁盘上展开?

如果您的表在内存中,那么简单表单也可能是最快的。

show t:flip`a`b`c`d`e!(1+til 100)*/:100 cut 500?(1 0N)where 19 1
a  b  c  d  e
--------------
1  1     1  1
2  2  2  2  2
3  3  3  3  3
4  4  4  4  4
5  5  5  5  5
6  6  6  6  6
7  7  7  7  7
8  8  8  8  8
9  9  9  9  9
10 10 10 10 10
11 11 11 11 11
12 12 12 12 12
13    13 13 13
14 14 14 14 14
15 15 15 15 15
16 16    16 16
   17 17 17 17
18 18 18 18 18
..

q)\ts:1000 ?[t;{(not;(null;x))}each cols t;0b;()]
5 7552
q)\ts:1000 t where not any null flip t
2 6768

如果桌子在磁盘上张开,游戏就会改变。在展开表中,每一列都存储为一个文件。Select 运算符的第二个参数是约束列表;每一个都是一个解析树。而上面测试的每个单元格,Select 依应用约束:只有通过上一个约束的行才会测试下一个约束。如果没有行满足第一个约束,则可能根本不需要读取后续列文件。null flip tt

由此遵循的规则是:按限制性的降序列出约束 - 如果 null 在某些列中更常见,请先测试它们。

关于内存中测试,请注意,它可能比 快很多,具体取决于 null 是否常见。not anyall not

q)q:null flip t
q)\ts:10000 all not q
9 1168
q)\ts:10000 not any q
6 656