7

任何想法如何在 KDB 中很好地做到这一点?

考虑表格

X:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)

我现在想要一个新表 Y,它从第二列中的符号中删除了“abc”,这样:

Y:([]a:1 2 3;b:`11`22`33;c:10 20 30)
4

5 回答 5

9
q)t:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
q)t
a b     c
----------
1 abc11 10
2 abc22 20
3 abc33 30

去掉前三个字符:

q)update `$3_'string b from t
a b    c
---------
1 11 10
2 22 20
3 33 30

或搜索并替换:

q)update `$ssr[;"abc";""] each string b from t
a b    c
---------
1 11 10
2 22 20
3 33 30

如果表很大并且有很多重复项,可以考虑使用 .Q.fu:

q)t:1000000#([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
q)\t r1:update `$3_'string b from t
111
q)\t r2:update .Q.fu[{`$3_'string x};b] from t
5
q)r1~r2
1b
于 2014-04-21T18:32:23.940 回答
1

按照其他答案中的建议使用 lambdas 很好,但对于这个问题不是必需的。如果仅使用副词就可以实现某些目标,那通常是可取的。

Y: update `$ 3_'string b from X

更短,更易读。在我的机器上,它的运行速度也快了一倍。

Y: update `$ ssr[;"abc";""] each string b from X

只是跑得快一点。我已经把两者都改回了`symbol。

于 2014-04-21T23:28:36.727 回答
1

要添加到@Ryan Hamilton 的答案,如果您想去掉最后两个字符,这里有一个示例:

q)update `$-2_'string b from t
a b    c
---------
1 abc 10
2 abc 20
3 abc 30
于 2020-01-24T19:49:05.097 回答
0

如果您的情况更普遍,并且您想删除第一个数字之前的所有内容,那么您可以执行以下操作。您可以进一步推广到符号类型的所有列

q)show r1:update b:`${(first each where each x in .Q.n)_'x}string b from X
a b  c
-------
1 11 10
2 22 20
3 33 30
q)show r2:@[X; exec c from meta X where t="s"; `${(first each where each x in .Q.n)_'x}string@]
a b  c
-------
1 11 10
2 22 20
3 33 30
q)r1~r2
1b

当然,我不知道你的设置是什么,但在我的机器上,这很快。几乎没有你的字典方法那么快,但可能值得为了一般性而牺牲

q)\ts update b:`${(first each where each x in .Q.n)_'x}string b from X
69 12746848j
于 2014-04-22T12:32:36.337 回答
0

我在大型数据库(100000 行)上尝试了两个提到的解决方案(由 ryan 和 mollmerx),我得到了以下结果:

ssr大约需要 645 毫秒(平均)

cut版本大约需要 40 毫秒(平均)

我尝试了另一种解决方案,它被证明要快得多。如果我们使用表的字典行为:

t[`b]:  `$3_'string t`b

这平均花费了大约 12 毫秒。

于 2014-04-22T05:29:31.277 回答