【问题标题】:kdb update statementkdb 更新语句
【发布时间】:2012-09-19 03:11:33
【问题描述】:

查看了所有文档。为什么这不起作用?加载了与 KDB 分发一起提供的 sp.q 示例文件。我无法弄清楚这句话有什么问题。

q) \l sp.q
q)trade
date       sym time         price    size
-----------------------------------------
2007.07.23 a   04:48:52.665 73.53941 1000
2007.07.23 a   04:48:52.675 81.73358 600
2007.07.23 a   04:48:52.725 78.79526 900
2007.07.23 a   04:48:52.735 79.59502 600
2007.07.23 b   04:48:52.655 84.59765 200
2007.07.23 b   04:48:52.685 98.36199 500
2007.07.23 b   04:48:52.705 97.49875 700
2007.07.23 c   04:48:52.645 61.48308 900
2007.07.23 c   04:48:52.695 61.53192 700
2007.07.23 c   04:48:52.715 71.95405 200

q)trade:update size:300 from trade where sym=`c,price>71
'par
q)trade
date       sym time         price    size
-----------------------------------------
2007.07.23 a   04:48:52.665 73.53941 1000
2007.07.23 a   04:48:52.675 81.73358 600
2007.07.23 a   04:48:52.725 78.79526 900
2007.07.23 a   04:48:52.735 79.59502 600
2007.07.23 b   04:48:52.655 84.59765 200
2007.07.23 b   04:48:52.685 98.36199 500
2007.07.23 b   04:48:52.705 97.49875 700
2007.07.23 c   04:48:52.645 61.48308 900
2007.07.23 c   04:48:52.695 61.53192 700
2007.07.23 c   04:48:52.715 71.95405 200

【问题讨论】:

    标签: kdb


    【解决方案1】:

    trade 是一个分区表,这就是失败的原因。你到底想做什么?如果要在内存中创建数据的编辑副本,则需要类似

    q)t:update size:300 from(select from trade)where sym=`c,price>71
    q)t
    date       sym time         price    size
    -----------------------------------------
    2007.07.23 a   04:48:52.665 73.53941 1000
    2007.07.23 a   04:48:52.675 81.73358 600
    2007.07.23 a   04:48:52.725 78.79526 900
    2007.07.23 a   04:48:52.735 79.59502 600
    2007.07.23 b   04:48:52.655 84.59765 200
    2007.07.23 b   04:48:52.685 98.36199 500
    2007.07.23 b   04:48:52.705 97.49875 700
    2007.07.23 c   04:48:52.645 61.48308 900
    2007.07.23 c   04:48:52.695 61.53192 700
    2007.07.23 c   04:48:52.715 71.95405 300
    q)
    

    如果您想更改磁盘上的数据,这在一般情况下是相当困难的。在这种特定情况下,您可以这样做:

    q){.Q.dd[.Q.par[`:.;x;`trade];`]set update size:300 from(select from trade where date=x)where sym=`c,price>71}2007.07.23
    `:./2007.07.23/trade/
    q)\l .
    q)trade
    date       sym time         price    size
    -----------------------------------------
    2007.07.23 a   04:48:52.665 73.53941 1000
    2007.07.23 a   04:48:52.675 81.73358 600
    2007.07.23 a   04:48:52.725 78.79526 900
    2007.07.23 a   04:48:52.735 79.59502 600
    2007.07.23 b   04:48:52.655 84.59765 200
    2007.07.23 b   04:48:52.685 98.36199 500
    2007.07.23 b   04:48:52.705 97.49875 700
    2007.07.23 c   04:48:52.645 61.48308 900
    2007.07.23 c   04:48:52.695 61.53192 700
    2007.07.23 c   04:48:52.715 71.95405 300
    q)
    

    【讨论】:

      【解决方案2】:

      该表按日期分区。您需要指定执行查询的日期,例如

      trade:update size:300 from trade where sym=`c,price>71, date within (<d1>;<d2>)
      

      【讨论】:

      • 我可能是错的,但他不应该be using a backtick before trade rather than just trade,所以他的表格会被原地修改而不是复制吗?
      • 不,他做得很好,尽管这也可以:update size:300 from `trade where sym=`c,price&gt;71, date within (&lt;d1&gt;;&lt;d2&gt;)
      • 无论有无反引号或日期条件,您都无法更新分区表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多