首页 文章

KDB选择查询和vs功能

提问于
浏览
1

只是好奇这个KX代码做了什么:

" " {`$first x vs y}/: column

它是在更新语句之后使用的大型KX查询的一部分 .

什么是 x vs y 以及它们来自哪里以及 /: 与左侧 " " 一起做什么?

整个查询看起来像这样:

select count i by date, somecolumn from update somecolumn:(" " {`$first x vs y}/: othercolumn) from select from some_table

什么是 x vs y 以及它们来自哪里以及 /: 与左侧 " " 一起做什么?

2 回答

  • 2

    /:adverb,表示'each right' .

    一个简单的例子是使用 ,/: 将左项加入每个右项:

    q)1 2 3,/:4 5 6
    1 2 3 4    / 1 2 3 join with 4
    1 2 3 5    / 1 2 3 join with 5
    1 2 3 6    / 1 2 3 join with 6
    

    vs 是'vector scalar',在您的情况下,它与分隔符" "分隔字符串 .

    q)" " vs "1 2 3"
    ,"1"
    ,"2"
    ,"3"
    

    {$first x vs y}是一个用x剪切y` 的函数,取第一个结果并将其转换为符号:

    q){`$first x vs y}[" ";"1 2 3"]
    `1
    

    将它们组合在一起, " " {$first x vs y}/: column` 表示用" "剪切'column'中的每个字符串,取每个结果中的第一个并将它们转换为符号:

    q)update res:" "{`$first x vs y}/:test from ([]test:("1 2 3";"4 5 6"))
    test    res
    -----------
    "1 2 3" 1
    "4 5 6" 4
    
  • 1

    简单来说:它从字符串中取出空格之前的第一个值并将其转换为符号 .

    例如:输入“Hello World”将输出“Hello”

    q> {`$first  x vs y}  [" ";"Hello World"]
    

    输出:`你好

    您可以使用简单列表对其进行测试(查询中的列将替换为与该列对应的表中的实际列表)

    q>  " "{`$first  x vs y}/: ("hello world" ; "test program")
    

    输出: hello 测试

    将此与ex1相比,“”被移动到开始,这是由于“每个权利(/ :)”的语法

    另一个更简单的版本是:

    q){`$first   " "  vs x } each ("hello world" ; "test program")
    

    WooiKent已经解释了这些功能 . 但这里有一些参考:

    Each-Right(/:) : 这是一个迭代右列表值的循环

    http://code.kx.com/q/ref/adverbs/#each-right

    vs(Vector From Scalar): 在某个分隔符上中断字符串

    http://code.kx.com/q/ref/casting/#vs

    在您的查询中,它采用类型为字符串作为输入的列 . 对于该列的每个元素(行),在空格之前取第一个值 . 最后将该值转换为符号 .

相关问题