我有一个表,其中包含一个包含以下格式数据的列 - 让我们调用列“title”和表“s”
标题
ab.123
ab.321
cde.456
cde.654
fghi.789
fghi.987
我正在尝试获取“。”前面的字符的唯一列表。所以我最终得到了这个:
ab
cde
fghi
我已经尝试将初始列选择到表中,然后尝试进行更新以使用“ss”创建一个新列的位置。
类似的东西:
t: select title from s
update thedot: (title ss `.)[0] from t
然后我要尝试做一个第3列,它是“title”中“N”个字符,其中N是存储在“thedot”列中的值。
当我尝试更新时,我得到的只是一个“类型”错误。
有什么想法吗?我对kdb很新,所以毫无疑问,以非常愚蠢的方式做一些简单的事情。
答案 0 :(得分:4)
您收到类型错误的原因是因为ss
仅适用于字符串类型,而不适用于符号。加ss
不是基于矢量的函数,因此您需要将它与每个'
组合。
q)update thedot:string[title] ss' "." from t
title thedot
---------------
ab.123 2
ab.321 2
cde.456 3
cde.654 3
fghi.789 4
有几种方法可以解决您的问题:
q)select distinct(`$"." vs' string title)[;0] from t
x
----
ab
cde
fghi
q)select distinct(` vs' title)[;0] from t
x
----
ab
cde
fghi
您可以在此处阅读以获取更多信息:http://code.kx.com/q/ref/casting/#vs
答案 1 :(得分:0)
另一种方法是利用0:
运算符来解析"。"分隔符。如果您拥有固定数量的'列,则此运算符特别有用。就像在csv文件中一样。在这种情况下,有一个固定数量的列,我们只想要第一个,一个不同的字符列表在"。"之前。可以退回:
exec distinct raze("S ";".")0:string title from t
`ab`cde`fghi
OR:
distinct raze("S ";".")0:string t`title
`ab`cde`fghi
其中"S "
定义每列的类型,"."
是记录分隔符。对于具有不同列数的记录,最好使用vs
运算符。
答案 2 :(得分:0)
WooiKent使用each-right
(/:
)的答案的变体:
q)exec distinct (` vs/:x)[;0] from t
`ab`cde`fghi