0

让我们有一个存储时间点(双时态)数据的表:

pit:([]dt:`date$();sym:`symbol$();val:`float$();stamp:`timestamp$())

示例数据可能如下所示:

`pit insert (2015.01.05 2015.01.06 2015.01.05;`IBM`IBM`MSFT;105.11 106.6 35.3; 2015.02.01D05:01:25.0 2015.02.01D05:01:25.0 2015.02.01D05:01:25.0)
pit
dt         sym  val    stamp                        
----------------------------------------------------
2015.01.05 IBM  105.11 2015.02.01D05:01:25.000000000
2015.01.06 IBM  106.6  2015.02.01D05:01:25.000000000
2015.01.05 MSFT 35.3   2015.02.01D05:01:25.000000000

例如,在该stamp时间点,我们记录了IBM符号的值 105.11,对2015.01.05

不断有新数据进来,其中一些将作为新记录插入到pit表中,但前提是它们传达了新信息。pit不得删除或更新/覆盖任何现有记录。即,我们希望跟踪过时的(如果有的话)值以用于审计或真实性目的。想想随着时间的推移收益估计的更新。

例如,稍后我们可能会收到:

new:([]dt:`date$();sym:`symbol$();val:`float$())
`new insert (2015.01.05 2015.01.06;`IBM`IBM;105.22 106.6)
new
dt         sym val   
---------------------
2015.01.05 IBM 105.22
2015.01.06 IBM 106.6 

new信息合并到pit后,后者应如下所示:

pit
dt         sym  val    stamp                        
----------------------------------------------------
2015.01.05 IBM  105.11 2015.02.01D05:01:25.000000000
2015.01.05 IBM  105.22 2015.03.10D15:43:50.000000000
2015.01.06 IBM  106.6  2015.02.01D05:01:25.000000000
2015.01.05 MSFT 35.3   2015.02.01D05:01:25.000000000

请注意使用当前时间戳(在撰写本文时)输入的符号的“新”105.22值。此外,from 的值并没有以任何方式更新时间戳,因为我们已经将该值反映在携带的旧时间戳中。IBMpit2015.03.10D15:43:50106.6newpitpit

如何使用 编写各自的insert语句q

注意:为了简单起见,它的价值pit是由此处未显示的附加列进行分区。source此外,分区将具有`g#sym(可能`p#sym相反)和`s#dt属性。

4

1 回答 1

2

您可以通过以下方式使用“upsert”:

参考:http ://code.kx.com/q/ref/qsql/#upsert

第 1 步。我在“新”表中添加状态列(否则最终表中的新行将为空)

       q) new:update stamp:`timestamp$.z.z from new

步骤 2. 将那些“新”列作为主键,其修改是添加行的标准。在您的情况下,它是除邮票列之外的所有列。

       q)new:except[cols new;`stamp] xkey new

第 3 步:将表格更新为(检查顺序:坑在右手边)

       q) pit: 0!new upsert pit

我已经从结果中删除了主键属性。

第 4 步:根据戳记(或任何其他列)对表格​​进行排序。

       q) pit: `stamp xasc pit

这是执行所有这些步骤的一项功能:

    q) myinsert:{[pit;new] `stamp xasc 0!(except[cols new;`stamp] xkey new:update stamp:`timestamp$.z.z from new) upsert pit}
于 2015-03-11T05:56:21.187 回答