首页 > 解决方案 > 如何在 KDB 中做一个 between join 子句?

问题描述

假设我有一个表 A,其中包含 bucket_start_date、bucket_end_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 中加入

select A.bucket_start_date, A.bucket_end_date, sum(coins) from A join B where B.date BETWEEN A.bucket_start_date and A.bucket_end_date group by A.bucket_start_date, A.bucket_end_date

所以我希望结果看起来像

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

标签: kdb

解决方案


窗口连接是实现此结果的一种自然方式。下面是一个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)是要应用于给定列的函数列表。同样,在这种情况下,您正在对每个窗口中的硬币列求和。

Awj考虑进入每个区间时的普遍值,而wj1只考虑每个区间中出现的值。您可以在函数中更改wj1wj以查看差异。


推荐阅读