Lambda和Projection组合的代码优化,对传递的args应用每个操作

时间:2019-05-21 14:33:33

标签: kdb

我可以从下面的代码中获得所需的结果,但是可以通过在lambda中使用lambda来实现:

Code:

    .up.dic:`a`b!(`ab`cd;`ef`gh);
    sd:2019.01.14;
    ed:2019.01.15;
    ({[m;d]{[m;d] 0N!m,d;}[m]@'d}@'raze .up.dic)[;sd+til(ed-sd)+1]

Result:
    (`ab;2019.01.14)
    (`ab;2019.01.15)
    (`cd;2019.01.14)
    (`cd;2019.01.15)
    (`ef;2019.01.14)
    (`ef;2019.01.15)
    (`gh;2019.01.14)
    (`gh;2019.01.15)

有没有一种方法可以摆脱内部lambda并在每个日期传递每个dict元素

{[m;d] 0N!m,d;}[m]@'d}/Can we get rid of this

在外部lambda中,在[;sd+til(ed-sd)+1]之前尝试了很多类似/的事情,但会导致长度或类型错误。

1 个答案:

答案 0 :(得分:2)

您可以使用cross

q) raze[.up.dic] cross sd+til(ed-sd)+1
`ab 2019.01.14
`ab 2019.01.15
`cd 2019.01.14
`cd 2019.01.15
`ef 2019.01.14
`ef 2019.01.15
`gh 2019.01.14
`gh 2019.01.15

使用副词自定义功能:

如果要在每对上执行其他操作,则可以结合使用left-left和every-right,并定义函数以在每对上执行操作。

例如,使用自定义函数定义联接操作。

q) my_func:{x,y} / x will be item from dict and y will be date from date list
q) raze raze[.up.dic] my_func/:\: sd+til(ed-sd)+1