残念ながら、CROSS APPLY を使用できない Vertica を使用しています。Vertica には CTE のようなものはないようです。
これが私が持っているものです:
t:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
初日のデルタはメトリック値と等しいことに注意してください。次のように、ギャップを埋めたいと思います。
t_fill:
day | id | metric | d_metric
-----------+----+--------+----------
2011-12-01 | 1 | 10 | 10
2011-12-02 | 1 | 10 | 0 -- a delta of 0
2011-12-03 | 1 | 12 | 2
2011-12-04 | 1 | 15 | 3
私はこれを毎日行う方法を考えてきましたが、私が本当に望んでいるのは、一度に機能するソリューションです。
LAST_VALUE で何かを動作させることができると思いますが、各 ID の日々の履歴を適切に分割して順序付けできる適切な JOIN ステートメントを思い付くことができません。
編集:次のようなテーブルがあるとします:
calendar:
day
------------
2011-01-01
2011-01-02
...
結合に関与する可能性があります。私の意図は、カレンダーの日付範囲をtの日付範囲と一致するように維持することです。
編集:具体的には、探しているものに関するいくつかのメモ:
t_fillを生成する際に、 tの日付範囲と、その間にない日付を正確にカバーしたいと思います。したがって、正しいt_fillはtと同じ日付で開始し、同じ日付で終了します。 t_fillには 2 つのプロパティがあります。
1) ある日付に ID が表示されると、以降の日付ごとに常に行が表示されます。これは、元の質問で暗示されているギャップを埋めることです。
2) ある日付以降に id の行が再び表示されない場合、t_fillソリューションは、その最後のデータ ポイントの日付からtの終了日まで、同じメトリック値 (および 0 デルタ) を持つ行を陽気に生成する必要があります。
ソリューションは、 tの日付範囲の開始までの以前の日付を埋め戻す可能性があります。つまり、 t の最初の日付の後に表示される id の場合、tの最初の日付と id の最初の日付の間の行は、metric=0 と d_metric=0 で埋められます。システムに入る各IDの成長率が高いため、この種のソリューションは好みません。しかし、metric!=0 および d_metric!=0 の行のみを新しいテーブルに選択することで、簡単に対処できました。