我有一个查询,该查询返回经常运行的数据结果。新表也将包含旧表的结果,但是我只想获取新表的最新运行中的新内容,并将其作为电子邮件发送。我已经有了用于发送电子邮件和交易数据的行,但是只需要一种方法就可以:
例如
旧结果: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 |
,然后保存新结果以在下一次运行中使用
谢谢! :)
答案 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