3

我有一个表,其中包含一个具有以下格式数据的列 - 让我们称列“标题”和表“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

然后我打算尝试做一个第三列,它是来自“title”的“N”个字符,其中 N 是存储在“thedot”列中的值。

当我尝试更新时,我得到的只是一个“类型”错误。

有任何想法吗?我对 kdb 很陌生,所以毫无疑问,我会以一种非常愚蠢的方式做一些简单的事情。

4

3 回答 3

6

您收到类型错误的原因是因为ss仅适用于字符串类型,而不适用于符号。Plusss不是基于向量的函数,因此您需要将其与每个'.

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

于 2014-10-17T14:45:11.303 回答
0

WooiKent 使用each-right( /:) 的答案的变体:

q)exec distinct (` vs/:x)[;0] from t
`ab`cde`fghi
于 2018-08-31T22:59:47.270 回答
0

另一种方法是使用0:运算符,围绕“。”进行解析。分隔符。如果您在 csv 文件中有固定数量的“列”,则此运算符特别有用。在这种情况下,列数固定,我们只需要第一个,即“。”之前的不同字符列表。可以返回:

exec distinct raze("S ";".")0:string title from t
`ab`cde`fghi

或者:

distinct raze("S ";".")0:string t`title
`ab`cde`fghi

where"S "定义了每一列的类型,"."是记录分隔符。对于具有不同列数的记录,最好使用vs运算符。

于 2017-11-29T10:52:45.800 回答