首页 > 解决方案 > 将迭代函数的输出存储到唯一表 KDB+/Q

问题描述

我有一个格式的查询功能:

function:{[x] select Y from table1 where date=x}

我想在存储在一个单独的表中的所有日子里迭代这个函数,就像这样

function each (select distinct date from table2)

并将每次迭代存储到它自己的唯一表中。例如,如果第一次迭代是针对 2021.11.10,则该日期 table1 中的所有“Y”值都存储在名为“a”的表中,对于日期 2021.11.12 的下一次迭代,它将转到名为“ b',或类似的东西。我怎样才能做到这一点?

标签: kdb

解决方案


假设以下表格:

q)t1:([]date:.z.d + 0 0 0 1 1 1;a:1 2 3 4 5 6)
q)t2:([]date:.z.d+0 1)

那么您可以执行以下操作:

q)function:{[x;y] x set select from t1 where date=y}
q)function'[`a`b;exec distinct date from t2]
`a`b
q)show a
date       a
------------
2021.11.10 1
2021.11.10 2
2021.11.10 3
q)show b
date       a
------------
2021.11.11 4
2021.11.11 5
2021.11.11 6

如果您想让它更有活力,那么您还可以执行以下操作:

q)function:{[x] (`$"tab",string[x] except ".") set select from t1 where date=x}
q)
q)
q)function each exec distinct date from t2
`tab20211110`tab20211111
q)show tab20211110
date       a
------------
2021.11.10 1
2021.11.10 2
2021.11.10 3
q)show tab20211111
date       a
------------
2021.11.11 4
2021.11.11 5
2021.11.11 6

上面创建了为每个日期命名的新表(我们从结果名称中删除了“.”,因为它们可能与 q 的.运算符混淆)


推荐阅读