将新列作为输出表-KDB

时间:2018-08-27 18:13:09

标签: export-to-csv kdb import-from-excel

我有一个查询,该查询返回经常运行的数据结果。新表也将包含旧表的结果,但是我只想获取新表的最新运行中的新内容,并将其作为电子邮件发送。我已经有了用于发送电子邮件和交易数据的行,但是只需要一种方法就可以:

  • 显示要通过电子邮件发送的新表格的结果
  • 保存要在下一次查询中使用的新表的完整结果

例如

旧结果:tbl

| idx | name  | age | 
| 0   | Tom   | 30  |
| 1   | Jerry | 25  |
| 2   | Bob   | 30  |
| 3   | Ken   | 45  |

新结果:tbl

| idx | name  | age | 
| 0   | Tom   | 30  |
| 1   | Jerry | 25  |
| 2   | Bob   | 30  |
| 3   | Ken   | 45  |
| 4   | Sam   | 40  |

需要的输出:

| 4   | Sam   | 40  |

,然后保存新结果以在下一次运行中使用

谢谢! :)

2 个答案:

答案 0 :(得分:3)

如果运行之间的唯一变化是将记录追加到新表上,则可以保留一个变量,该变量表示最后看到的索引,然后仅选择idx大于该行的那些行。

如果索引始终在增加,则可以使用

这样的查询来实现
lastidx:exec last idx from tbl
select from tbl where idx>lastidx

如果idx值并非总是单调增加,则可以仅对行数进行计数

lasti:count tbl
select from tbl where i>=lasti

这不需要将整个表保存在内存中以供下次迭代使用。

例如,从旧表开始有4行,因此lasti = 4

q)tbl
idx name  age
-------------
0   Tom   30
1   Jerry 25
2   Bob   30
3   Ken   45

q)lasti
4

新表进入并运行命令以选择新行

q)tbl
idx name  age
-------------
0   Tom   30
1   Jerry 25
2   Bob   30
3   Ken   45
4   Sam   40

q)select from tbl where i>lasti
idx name age
------------
4   Sam  40

lasti然后可以更新以反映新的计数

q)lasti:count tbl
q)lasti
5

答案 1 :(得分:0)

假设idx是唯一键,则是完成此操作的一种方法:

q)old:([] idx:0 1 2 3; name:`T`J`B`K; age: 30 25 30 45)
q)new:old,enlist `idx`name`age!(4; `S;40)  //new output from your query

q)out:()
q)if[0<count i:new[`idx] except old[`idx] ; out:new i ; old:new]

q)out
idx name age
------------
4   S    40

另一种方式,如果您的新记录总是添加到旧记录的最后一条:

q)old:([] idx:0 1 2 3; name:`T`J`B`K; age: 30 25 30 45)
q)i:count old
q)new:old,enlist `idx`name`age!(4; `S;40) //new output from your query

q)out:()
q)if[i<c:count new  ; out:(i-c)#new  ; old:new; i:c]
q)out
idx name age
------------
4   S    40