【问题标题】:KDB: Function optimizationKDB:功能优化
【发布时间】:2020-01-16 08:12:30
【问题描述】:

我在 kdb 中有 2 个表,如下所示

q)table1:([]A:1 2 3 5 5 6 2 1;B:`HAK`ZAK`NAK`AAK`AZK`HAK`ZAK`HAK;C:2000.01.01+0 1 2 3 4 0 1 0)
q)table1
A B   C
----------------
1 HAK 2000.01.01
2 ZAK 2000.01.02
3 NAK 2000.01.03
5 AAK 2000.01.04
5 AZK 2000.01.05
6 HAK 2000.01.01
2 ZAK 2000.01.02
1 HAK 2000.01.01
q)table2:([]B:`HAK`ZAK`NAK`AAK`AZK;Z:`NAFK`RFK`NAFK`RFK`ORQ)
q)table2
B   Z
--------
HAK NAFK
ZAK RFK
NAK NAFK
AAK RFK
AZK ORQ

我想根据表 2 的映射来修改表 1 的 B 列。 例如,table1 columnB 中的任何位置都有单词“HAK”,然后查看 table2 columnB 并将 table1 替换为相应的 table2 columnz table1 的所有行都相同。

我想要的最终输出是 table1 应该如下更新。

A B    C
-----------------
1 NAFK 2000.01.01
2 RFK  2000.01.02
3 NAFK 2000.01.03
5 RFK  2000.01.04
5 ORQ  2000.01.05
6 NAFK 2000.01.01
2 RFK  2000.01.02
1 NAFK 2000.01.01

我想出的功能如下。

hfun:
{$[
x in `$("HAK");`$("NAFK");
x in `$("ZAK");`$("RFK");
x in `$("NAK");`$("NAFK");
x in `$("AAK");`$("RFK");
x in `$(AZK);`$("ORQ");
x]}


finalOutput:update B:hfun'[B] from table1

上述函数按预期工作,但每次为新映射编写新函数或 table2 有 200 行时编写新函数是不可行的。

有人可以看看并提供进一步的建议吗?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    也可以使用amend 来实现:

    @[table1;`B;(!/)table2`B`Z]
    

    【讨论】:

      【解决方案2】:
      update B:({x[;0]!x[;1]}flip value flip table2)'[B]from table1
      

      这将达到预期的结果,而无需定义额外的变量或条件语句。 它也适用于符号中的空格。

      【讨论】:

        【解决方案3】:

        您可以使用字典更新而不是带条件的循环:

        dict:`HAK`ZAK`NAK`AAK`AZK!`NAFK`RFK`NAFK`RFK`ORQ;
        update B^dict B from table1
        
        (with spaces)
        table1:([]A:1 2 3 5 5 6 2 1;B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK";`$"HAK";`$"ZAK";`$"HAK");C:2000.01.01+0 1 2 3 4 0 1 0)
        table2:([]B:(`$"HAK z";`$"ZAK";`$"NAK";`$"AAK";`$"AZK");Z:`NAFK`RFK`NAFK`RFK`ORQ)
        
        dict:exec B!Z from table2;
        update B^dict B from table1
        

        【讨论】:

        • 感谢康纳,如果 table1 columnB 在单词之间有空格怎么办。例如HAK 1 HAK 2 `HAK 3 我们有没有办法做到这一点?我在表 2 中有 80-200 条记录。我们也可以直接使用table2创建字典吗?
        • @Haiderali Connor 的第二个使用exec 语句生成dict 的示例将不管空格等如何工作。
        • 尼斯万康纳
        • 太棒了它成功了,非常感谢康纳,真的很感谢你的快速反应。
        【解决方案4】:

        你也可以使用 lj

        q)select A,B:B^Z,C from table1 lj `B xkey table2
        A B    C
        -----------------
        1 NAFK 2000.01.01
        2 RFK  2000.01.02
        3 NAFK 2000.01.03
        5 RFK  2000.01.04
        5 ORQ  2000.01.05
        6 NAFK 2000.01.01
        2 RFK  2000.01.02
        1 NAFK 2000.01.01
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 2018-12-25
          • 2021-07-29
          相关资源
          最近更新 更多