0

kdb/q 中的meta函数返回有关表的以下信息:

  1. c –(符号)列名
  2. t – (char) 数据类型
  3. f –(符号)外键域
  4. a - (符号)属性。

我想扩展它以包含有关该表的更多信息。我试图解决的具体情况是在表中包含有关时间数据列的时区信息。

例如: select from Price

+-------------------------+-------------------------+--------+-------+
|          Time           |         SysTime         | Ticker | Price |
+-------------------------+-------------------------+--------+-------+
| 2016.09.15D09:18:02.391 | 2016.09.15D08:18:02.391 | IBM    | 63.46 |
| 2016.09.15D09:18:02.491 | 2016.09.15D08:16:22.391 | MSFT   | 96.72 |
| 2016.09.15D09:18:02.591 | 2016.09.15D08:14:42.391 | AAPL   | 23.06 |
+-------------------------+-------------------------+--------+-------+

meta Price

+---------+---+---+---+
|    c    | t | f | a |
+---------+---+---+---+
| Time    | p |   |   |
| SysTime | p |   |   |
| Ticker  | s |   |   |
| Price   | f |   |   |
+---------+---+---+---+

我想了解有关元数据中时间数据列(TimeSysTime)的更多信息。

例如,像这样:

metaExtended Price

+---------+---+---+---+------------------+
|    c    | t | f | a |        z         |
+---------+---+---+---+------------------+
| Time    | p |   |   | America/New_York |
| SysTime | p |   |   | America/Chicago  |
| Ticker  | s |   |   |                  |
| Price   | f |   |   |                  |
+---------+---+---+---+------------------+

请注意,我有一个函数可以在表和列中返回时区。 TimeZone[Price;Time]返回America/New_York

我的问题只是关于如何在元函数中包含这些信息。我遇到的第二个问题是,如果用户做了这样的事情newPriceTable:Price(创建一个与前一个表相同的新表),那么该metaExtended函数应该为两个表返回相同的值(类似于在两个表上调用一个函数)具有相同对象引用的不同变量)

sql中是否存在类似的东西?

4

2 回答 2

2

meta是保留字,因此不能重新定义。但是您可以创建自己的实现并使用它来代替meta

TimeZone:{[Table;Col] ... } / your TimeZone function

metaExtended:{meta[x],'([]z:TimeZone[t]each cols x)}

metaExtended Price

关于你的第二个问题,我认为不可能在 k/q 中做你想做的事。在分配PricenewPriceTable后者之后立即确实是一个引用,但是一旦你修改它,kdb 就会创建一个副本并修改它而不是原始的。问题是没有办法判断它是否newPriceTable仍然是一个引用Price或一个新的新对象。

于 2016-09-15T14:53:02.567 回答
0

您可以使用 lj 将它们加入一个 metaExtended 函数。

该函数将检查所有时间列并在它们上运行 TimeZone 函数并将结果与​​元结果连接:

      metaExtended:{[tbl] meta[tbl] lj  1!select c,z:TimeZone[tbl] each t from meta[tbl] where t in "tp"}

      metaExtended `t

当您将此表分配给新变量时,它将被分配为参考。

         nt:t / nt and t pointing to same object

你可以使用 -16 检查变量的引用计数!.

          -16!t

此时 metaExtended 函数将给出相同的输出。但是一旦对指向同一个表的这些变量中的任何一个进行了一些更新,kdb 将为更新的表/变量创建一个新副本。从这一点来看,它们是 2 个不同的对象。现在 metaExtended 函数的输出取决于对象模式。

于 2016-09-15T15:07:25.757 回答