我有一张桌子:
q)t:([] a:1 2 3; b:```; c:`a`b`c)
a b c
-----
1 a
2 b
3 c
我要从此表中仅选择不具有空值的列,在这种情况下,输出中应省略列b。(类似于pandas中的dropna方法)。
expected output
a c
---
1 a
2 b
3 c
我尝试了很多类似
select from t where not null cols
但没有用。
答案 0 :(得分:6)
这是一个简单的解决方案,可以满足您的需求:
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
在哪里返回字典中的键,这是真的
q)where[all null t]
,`b
最后,您使用_从表t中删除列
希望这会有所帮助
答案 1 :(得分:1)
kdb的本质是基于列的,这意味着where子句在给定列的行上起作用。
要使QSQL查询产生所需的行为,您需要首先检查所有列,确定哪些列为 all 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
在这里,我将表格转换成字典,并提取其值以确定是否有任何列仅包含空值(all each null each
)。然后,我通过where语句将该布尔值列表应用于字典的键(即列名)。然后,我们可以使用这些键将索引重新索引到原始字典中,并创建非空列的子集字典,然后将其转换回表中。
我已经按习惯将最终的转换归纳为带有错误捕获的表,以确保即使只有一行有效(防止出现'rank
错误),字典也可以转换为表< / p>
答案 2 :(得分:1)
对Sander解决方案的修改,它可以处理字符串列(或任何嵌套列):
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