0

kdb/qのmeta関数は、テーブルに関する次の情報を返します。

  1. c – (記号) 列名
  2. t – (文字) データ型
  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 |   |   |
+---------+---+---+---+

メタの時間データ列 (Timeおよび)に関する追加情報が必要です。SysTime

たとえば、次のようなものです。

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

私の質問は、この情報をメタ関数に含める方法についてのみです。私が持っている2番目の質問は、ユーザーがこのようなことをした場合newPriceTable:Price(前のテーブルと同じ新しいテーブルを作成する)、metaExtended関数は両方のテーブルに対して同じ値を返す必要があるということです(2つのテーブルで関数を呼び出すのと同様)同じオブジェクト参照を持つ異なる変数)

同様のものがSQLに存在しますか?

4

2 に答える 2

2

metaは予約語であるため、再定義できません。ただし、独自の実装を作成して、代わりに使用できますmeta

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

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

metaExtended Price

2 番目の質問については、k/q でやりたいことができないと思います。Price後者に割り当てた直後newPriceTableは確かに参照ですが、変更するとすぐにkdbがコピーを作成し、元の代わりに変更します。問題は、newPriceTableがまだ参照されているのPriceか、新しいオブジェクトなのかを判断する方法がないことです。

于 2016-09-15T14:53:02.567 に答える
0

lj を使用して、それらを 1 つの 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 に答える