如何在KDB中执行interween-join子句?

如何在KDB中执行interween-join子句?,kdb,Kdb,假设我有一个表a,列为bucket\u start\u date,bucket\u end\u date A bucket_start_date | bucket_end_date 2015.05.02 | 2015.05.08 2015.05.08 | 2015.05.12 还假设我有一个表B,列有日期、硬币 A date | coins 2015.05.02 | 5 2015.05.06 | 11 2015.05.09 | 32

假设我有一个表a,列为bucket\u start\u date,bucket\u end\u date

A
bucket_start_date | bucket_end_date
2015.05.02        | 2015.05.08
2015.05.08        | 2015.05.12
还假设我有一个表B,列有日期、硬币

A
date        | coins
2015.05.02  | 5
2015.05.06  | 11     
2015.05.09  | 32
我如何在kdb中进行逻辑上类似的连接

从连接B中选择A.bucket\u开始日期、A.bucket\u结束日期、总和(硬币),其中B.date在A.bucket\u开始日期和A.bucket\u结束日期组之间,由A.bucket\u开始日期、A.bucket\u结束日期选择

所以我希望结果是这样的

bucket_start_date | bucket_end_date | sum(coins) 
2015.05.02        | 2015.05.08      | 16 
2015.05.08        | 2015.05.12      | 32

首先,在命名约定中不使用u是一个很好的约定,因为u在q中也用作drop操作符

q)data:([]bucketSt:2015.05.02 2015.05.08;bucketEnd:2015.05.08 2015.05.12)
q)daterange:([]date:2015.05.02 2015.05.06 2015.05.09; coins: 5 11 32)
但是没有窗口连接的问题的解决方案可以是一个相当简单的select语句

update coins:({exec sum coins from daterange where date within x} each get each data) from data
从()括号内开始

q)get each data
2015.05.02 2015.05.08
2015.05.08 2015.05.12
返回每行的开始和结束时间。 其中,带有聚合的简单exec语句从daterange表中获取必要的结果。最后,对原始表使用update语句和新值。返回表格如下:

bucketSt   bucketEnd  coins
---------------------------
2015.05.02 2015.05.08 16
2015.05.08 2015.05.12 32

也有可能进行更有效的窗口连接,但这应该很容易理解。希望有帮助

首先,在命名约定中不使用u是一个很好的约定,因为u在q中也用作drop操作符

q)data:([]bucketSt:2015.05.02 2015.05.08;bucketEnd:2015.05.08 2015.05.12)
q)daterange:([]date:2015.05.02 2015.05.06 2015.05.09; coins: 5 11 32)
但是没有窗口连接的问题的解决方案可以是一个相当简单的select语句

update coins:({exec sum coins from daterange where date within x} each get each data) from data
从()括号内开始

q)get each data
2015.05.02 2015.05.08
2015.05.08 2015.05.12
返回每行的开始和结束时间。 其中,带有聚合的简单exec语句从daterange表中获取必要的结果。最后,对原始表使用update语句和新值。返回表格如下:

bucketSt   bucketEnd  coins
---------------------------
2015.05.02 2015.05.08 16
2015.05.08 2015.05.12 32
也有可能进行更有效的窗口连接,但这应该很容易理解。希望有帮助

A是实现这一结果的自然方式。下面是一个
wj1
函数,它将获得您想要的:

q)wj1[A`bucket_start_date`bucket_end_date;`date;A;(B;(sum;`coins))]
bucket_start_date bucket_end_date coins
---------------------------------------
2015.05.02        2015.05.08      16
2015.05.08        2015.05.12      32
第一个变量是一对日期列表,第一个是开始日期,最后一个是结束日期

第二个变量是公共列,在本例中,您希望使用
date
列,因为您要查看每个日期适合哪个窗口

第三个和第四个变量包含要联接的简单表,最后
(sum;`coins)
是要应用于给定列的函数列表。同样,在本例中,您将对每个窗口中的硬币列求和

wj
考虑每个区间输入时的主要值,而
wj1
只考虑每个区间中出现的值。您可以在函数中将
wj1
更改为
wj
,以查看差异。

A是实现此结果的自然方式。下面是一个
wj1
函数,它将获得您想要的:

q)wj1[A`bucket_start_date`bucket_end_date;`date;A;(B;(sum;`coins))]
bucket_start_date bucket_end_date coins
---------------------------------------
2015.05.02        2015.05.08      16
2015.05.08        2015.05.12      32
第一个变量是一对日期列表,第一个是开始日期,最后一个是结束日期

第二个变量是公共列,在本例中,您希望使用
date
列,因为您要查看每个日期适合哪个窗口

第三个和第四个变量包含要联接的简单表,最后
(sum;`coins)
是要应用于给定列的函数列表。同样,在本例中,您将对每个窗口中的硬币列求和


wj
考虑每个区间输入时的主要值,而
wj1
只考虑每个区间中出现的值。您可以在函数中将
wj1
更改为
wj
,以查看差异。

下划线
\u
在符号和列名中不是问题字符,因此一般来说,我认为使用
\u
的做法是可以的。所有其他字符都是。是否有一种方法可以将函数设置为sum((B.date-a.bucket\u start\u date)*B.coins)而不是sum(B.coins)的列?我想要的是一列硬币的加权和,按到开始日期的距离加权,而不仅仅是一列简单的和。在符号和列名中,derscore
不是一个问题字符,所以一般来说,我认为使用
的做法是好的。所有其他字符都是。是否有一种方法可以将函数设置为sum((B.date-a.bucket\u start\u date)*B.coins)而不是sum(B.coins)的列?我想要的是一列硬币的加权和,按到开始日期的距离加权,而不是一列简单的和。有没有一种方法可以让一列的函数是sum((B.date-a.bucket\u start\u date)*B.coins),而不是sum(B.coins)?我想要的是一列硬币的加权和,按到开始日期的距离加权,而不是一列简单的和。有没有一种方法可以让一列的函数是sum((B.date-a.bucket\u start\u date)*B.coins),而不是sum(B.coins)?我想要的是一列硬币的加权和,按到开始日期的距离加权,而不仅仅是一列简单的和