仅从表中选择QKDB中没有空值的列

仅从表中选择QKDB中没有空值的列,kdb,Kdb,我有一张桌子: q)t:([] a:1 2 3; b:```; c:`a`b`c) a b c ----- 1 a 2 b 3 c 从这个表中,我只想选择没有空值的列,在这种情况下,应该从输出中省略b列(类似于pandas中的dropna方法) 我试过很多东西,比如 select from t where not null cols 但是没有用。这里有一个简单的解决方案,可以满足您的需求: q)where[all null t]_t a c --- 1 a 2 b 3 c [a

我有一张桌子:

q)t:([] a:1 2 3; b:```; c:`a`b`c)
a b c
-----
1   a
2   b
3   c
从这个表中,我只想选择没有空值的列,在这种情况下,应该从输出中省略b列(类似于pandas中的dropna方法)

我试过很多东西,比如

select from t where not null cols

但是没有用。

这里有一个简单的解决方案,可以满足您的需求:

q)where[all null t]_t
a c
---
1 a
2 b
3 c
[all null t]提供一个字典,用于检查列值是否全部为null

q)all null t
a| 0
b| 1
c| 0
Where返回字典中为true的键

q)where[all null t]
,`b
最后使用u从表t中删除列


希望这有助于

kdb的本质是基于列的,这意味着where子句在给定列的行上起作用

要使QSQL查询产生所需的行为,您需要首先检查所有列并确定哪些列都为null,然后将其输入到函数语句中。这将是非常低效的

考虑到您需要全面检查所有列数据(以检查所有值是否为null),下面将实现这一点

q)@[flip;;enlist] k!d k:key[d] where not all each null each value d:flip t
a c
---
1 a
2 b
3 c
在这里,我将表转换为字典,并提取其值以确定是否有任何列仅由null组成(
all-each-null-each
)。然后,我通过where语句将该布尔列表应用于字典的键(即列名)。然后,我们可以使用这些键重新索引到原始字典中,创建非空列的子集字典,并将其转换回表


我习惯性地将最后的转换返回到一个表中,并带有一个错误捕获,以确保即使只有一行是有效的,字典也会转换成一个表(防止出现
'rank
错误)

Sander解决方案的一个修改,该解决方案处理字符串列(或任何嵌套列):

q)@[flip;;enlist] k!d k:key[d] where not all each null each value d:flip t
a c
---
1 a
2 b
3 c
q)t:([] a:1 2 3; b:```; c:`a`b`c;d:"   ";e:("";"";"");f:(();();());g:(1 1;2 2;3 3))

q)t
a b c d e  f g
----------------
1   a   ""   1 1
2   b   ""   2 2
3   c   ""   3 3

q)where[{$[type x;all null x;all 0=count each x]}each flip t]_t
a c g
-------
1 a 1 1
2 b 2 2
3 c 3 3