Взять новые столбцы в качестве выходной таблицы - KDB - PullRequest
0 голосов
/ 27 августа 2018

У меня есть запрос, который возвращает результаты данных, который выполняется на частой основе. Новая таблица также будет содержать результаты старой таблицы, но я хочу взять только то, что есть в новой версии, в последнем запуске новой таблицы и отправить это по электронной почте. У меня уже есть строка для электронной почты и торговых данных, но мне нужен только способ:

  • отображать результаты новой таблицы для отправки по электронной почте
  • сохранить полные результаты новой таблицы, которая будет использоваться при следующем запуске запроса

, например

Старые результаты: 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 голосов
/ 27 августа 2018

Если единственными изменениями между прогонами является то, что записи добавляются в новую таблицу, вы можете просто сохранить переменную, обозначающую последний увиденный индекс, а затем выбрать только те строки, в которых 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
0 голосов
/ 27 августа 2018

Один из способов сделать это, предполагая, что 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
...