時系列データの結合

時系列データを含むテーブルを結合するには、 ASOF JOIN 構文を使用します。ASOF JOIN は、SELECT ステートメントの FROM 句内で標準構文として使用できます。ASOF JOIN クエリは複雑な SQL や他の型の結合、ウィンドウ関数を使用することでエミュレートできますが、 ASOF JOIN 構文を使用すると、これらのクエリの作成が簡単になります(最適化もされます)。

紹介

ASOF 結合を使用して、金融取引データなどの時系列データを分析できます。たとえば、取引コスト分析では、株式の購入を決定した時点での気配値と、取引が実行および記録された時点で実際に支払われた価格との差を測定する「スリッページ」計算が必要です。ASOF JOIN はこの種の分析を迅速化できます。この結合方法の主な機能は、ある時系列を別の時系列と比較して分析することであるため、 ASOF JOIN は、気象観測、センサーからの読み取り、監査証跡など、本質的に履歴的なデータセットを分析するのに役立つ可能性があります。これらのユースケースの多くでは、異なるデバイスから読み取られたタイムスタンプが完全に同じではない場合に、データを関連付けるために ASOF JOIN が使用されることがあります。

分析が必要な時系列データが2つのテーブルに存在し、各テーブルの各行にタイムスタンプがあることが前提となります。このタイムスタンプは、記録されたイベントの正確な「その時点」の日付と時刻を表します。最初(または左側)のテーブルの各行に対して、結合では、指定した比較演算子を持つ「一致条件」を使用して、タイムスタンプ値が次のいずれかである2番目(または右側)のテーブル内の単一の行を検索します。

  • 左側のテーブルのタイムスタンプ値以下。

  • 左側のテーブルのタイムスタンプ値以上。

  • 左側のテーブルのタイムスタンプ値より小さい。

  • 左側のテーブルのタイムスタンプ値より大きい。

右側の条件に該当する行はもっとも近い一致であり、指定された比較演算子に応じて、時間的に等しい、時間的に早い、または時間的に遅い可能性があります。

ASOF JOIN の結果のカーディナリティは常に左側のテーブルのカーディナリティと等しくなります。左側のテーブルに4,000万行が含まれている場合、 ASOF JOIN は4,000万行を返します。したがって、左側のテーブルは「保存」テーブル、右側のテーブルは「参照」テーブルと考えることができます。

ASOF JOIN クエリの概念的な例

たとえば、財務アプリケーションで、 quotes という名前のテーブルと trades という名前のテーブルがあるとします。1つのテーブルには株式購入の入札履歴が記録され、もう1つのテーブルには実際の取引履歴が記録されます。株式購入の入札は取引の前に行われます(記録された時間の粒度に応じて、「同時に」行われる場合もあります)。どちらのテーブルにもタイムスタンプがあり、比較対象として使用するその他の列も両方にあります。単純な ASOF JOIN クエリは、各取引の前にもっとも近い気配値(時間的に)を返します。言い換えると、クエリは次のように尋ねます。「取引を行った時点での株価はいくらでしたか」

trades テーブルには3つの行が含まれ、 quotes テーブルには7つの行が含まれるとします。セルの背景色は、一致する銘柄シンボルで行を結合し、そのタイムスタンプ列を比較したときに、 quotes のどの3行が ASOF JOIN の対象となるかを示しています。

TRADES テーブル(左側または「保存」テーブル)

3行で構成され、quotesテーブルの3行と結合されるtradesテーブルのデータ。

QUOTESテーブル(右側または「参照」テーブル)

7行で構成され、quotesテーブルとの結合に該当する3つの特定の行を識別するquotesテーブルのデータ。

これら3つの強調表示された行の組み合わせを生成する構文(および他の多くの例)を確認するには、 一致および ON で結合する をご参照ください。