2016-09-15 6 views
0

KDB/Qでmeta関数テーブルに関する以下の情報を返す:拡張メタデータ

  1. C - (シンボル)カラム名
  2. トン - (CHAR)データ型
  3. F - (シンボル)ドメイン
  4. a - (symbol)属性。

これを拡張して、テーブルの詳細について説明します。私が解決しようとしている具体的なケースは、時間データ列に関するタイムゾーン情報をテーブルに含めることです。例えば

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

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

sqlに類似したものはありますか?

答えて

1

metaは予約語なので、再定義することはできません。しかし、あなたは独自の実装を作成し、metaの代わりにそれを使用することができます:あなたの2番目の質問については

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

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

metaExtended Price 

、私はそれはあなたがK/Qでやりたいことができないと思います。 PricenewPriceTableに割り当てた直後は後者が実際には参考になりますが、修正するとすぐにkdbがコピーを作成してオリジナルの代わりに変更します。問題は、newPriceTableが依然としてPriceへの参照であるか新鮮な新しいオブジェクトであるかを判断する方法がないことです。

+0

あなたは常にQKでメタを再定義することができます - :)だけでお勧めできません のかの線に沿って何かを使用.. '.q.ometa:メタ;' ' .q.metaを:。{q.ometa [x]、 '([z]:TimeZone [t] each cols x)} –

+1

ありがとうIgorと@Connor – user2419511

0

ljを使用して、それらを1つのmetaExtended関数に結合できます。

機能は、すべての時間のcolsをチェックし、それらにタイムゾーン機能を実行し、メタ結果と結果を結合します:

 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 

Yoは-16を使用して変数の参照カウントをチェックできます! 。

  -16!t 

この時点で、metaExtended関数は同じ出力を返します。しかし、これらの変数が同じテーブルを指している場合、kdbは更新されたテーブル/変数の新しいコピーを作成します。この時点から、彼らは2つの異なるオブジェクトです。 metaExtended関数の出力は、オブジェクトスキーマによって異なります。