2

私は現在、タイムスタンプに至るまでのすべてのレコードを 1 分引き込んでいます (たとえば、関心のあるタイムスタンプが の場合2014.04.14T09:30):

select from Prices where timestamp within 2014.04.14T09:29 2014.04.14T09:30, stock=`GOOG

ただし、これは明らかにあまり堅牢ではありません。前のレコードが at09:25amで、クエリが何も返さない場合があります。価格が何度も変更された場合、最後に返されたレコードだけが必要な場合でも、クエリによって数百のレコードが返されることがあります。

Pricesこれはasof結合で実行できることはわかっていますが、現時点では大きすぎるため、当面は避けたいと思います。

私も同じことをすることに興味がありますが、特定のタイムスタンプの後の最初のレコードを見つけることに興味があります。

拡大されたテーブルでPricesあることにも注意してください

4

3 に答える 3

3

指定されたタイムスタンプより前の最後のレコードを選択します。

q)select from Price where stock=`GOOG,i=last i,timestamp<2014.04.14T09:30

指定されたタイムスタンプの後の最初のレコードを選択します。

q)select from Price where stock=`GOOG,i=first i,timestamp>2014.04.14T09:30
于 2014-04-14T10:41:17.103 に答える
2

asofまたはを使用ajして、kdb+ で知られているパフォーマンスを取得します。価格が大きいほど、そうする理由が多くなります。

を避けるためのあなたの論理に疑問を投げかけますajajバイナリ検索である演算子をasof使用するためbin、タイムスタンプ列をスキャンするよりもパフォーマンスが高くなります。

テーブルを作成し、他の回答からソリューションを実行しましょう。

Prices:([]stock:`g#1000000?`GOOG,9?`4;timestamp:asc 2014.04.14+1000000?0t;price:1000000?100f,size:1000000?100j)
q)\t do[1000;select from Prices where timestamp<2014.04.14T09:30,stock=`GOOG,i=last i]
10205

制約を並べ替えることで、これを大幅に改善できます。

q)\t do[1000;select from Prices where stock=`GOOG,timestamp<2014.04.14T09:30,i=last i]
2030

しかし、これに勝るものはありません:

q)\t do[1000;Prices asof `stock`timestamp!(`GOOG;2014.04.14D09:30)]
9

ところで、質問で datetime を使用していますが、これは推奨されていないため、タイムスタンプに置き換えました。これによるパフォーマンスへの影響はありません。

于 2014-04-19T16:03:03.027 に答える