您可以通过在日期列上添加额外的聚合函数来修改上一个问题的窗口连接,如下所示:
q)show w:wj1[A`bucket_start_date`bucket_end_date;`date;A;(B;(sum;`coins);(::;`date))]
bucket_start_date bucket_end_date coins date
-------------------------------------------------------------
2015.05.02 2015.05.08 16 2015.05.02 2015.05.06
2015.05.08 2015.05.12 32 ,2015.05.09
q)show w:ungroup w
bucket_start_date bucket_end_date coins date
--------------------------------------------------
2015.05.02 2015.05.08 16 2015.05.02
2015.05.02 2015.05.08 16 2015.05.06
2015.05.08 2015.05.12 32 2015.05.09
在窗口连接的末尾,您可以添加标识函数(::),它将简单地输出输入,在这种情况下,它是位于相应窗口内的 B 表的日期列的日期。还可以使用ungroup 关键字来“分解”表格,这样这个新的日期列就不是日期列表。
使用这个表w,一个select语句(很像你提供的那个)可以得到硬币的加权总和:
q)select sum coins*date-bucket_start_date by bucket_start_date,bucket_end_date from w
bucket_start_date bucket_end_date| coins
---------------------------------| -----
2015.05.02 2015.05.08 | 64
2015.05.08 2015.05.12 | 32
您可以重新排序选择语句中的操作以避免需要括号!
编辑:
为了回答您的后续问题,我修改了wj1 以获得与您的问题所需的表格类似的表格:
q)t:wj1[A`bucket_start_date`bucket_end_date;`date;A;(B;(::;`coins);(::;`date))]
q)t
bucket_start_date bucket_end_date coins date
----------------------------------------------------------------
2015.05.02 2015.05.08 5 11 2015.05.02 2015.05.06
2015.05.08 2015.05.12 ,32 ,2015.05.09
2015.05.12 2015.05.18 `long$() `date$()
选择空行的一种方法是对每一行进行计数,并取所有计数为 0 的行:
q)select from t where not count each coins
bucket_start_date bucket_end_date coins date
--------------------------------------------
2015.05.12 2015.05.18
我们可以通过逐步分解 where 子句来了解它的作用:
q)t`coins
5 11
,32
`long$()
q)count each t`coins
2 1 0
q)not count each t`coins
001b
最后一行使用not 关键字快速将long 转换为布尔值。在这种情况下,not 将返回 1b 为每个 long 为 0,0b 为每个非零 long。