2017-10-02 2 views
0

私は約百万行との以下のpostgresテーブルを持っています。Postgres - 単一の大きなテーブルでのデータ操作

id |基礎| option_symbol | option_type | expiration_date |ストライク|ミッド|

私は数秒の下で、次を実行する必要があります。

  1. 『2017年12月1日』
  2. がoption_typeですべての行を取得option_type =」foo」とEXPIRATION_DATE>ですべての行を取得します。 = "bar"とexpiration_date> "2017-12-01"
  3. クエリ#1の各行について、同じ基礎とexpiration_dateを持つクエリ#2の結果行をループオーバーし、ストライク#1とストライク#2。
  4. 計算された「スプレッド」のこの結果リストをソートし、各シンボルに対して最良の結果を得ます。

は、どのように私は以下の例では、 "クエリの" 計算(spread_profit、spread_distance、spread_max_loss、spread_profit_ratio)を行うのですか?

例:

SELECT a.underlying, 
     a.expiration_date, 
     (a.strike - b.strike) as spread_profit, 
     (a.mid - b.mid) as spread_distance, 
     (spread_distance - spread_profit) as spread_max_loss, 
     (spread_profit/spread_max_loss) as spread_profit_ratio 
FROM option_data a 
    JOIN option_data b ON a.underlying = b.underlying AND a.expiration_date = b.expiration_date 
WHERE a.option_type = 'foo' 
    AND b.option_type = 'bar' 
    AND a.expiration_date <= '2017-12-01' 
    AND b.expiration_date <= '2017-12-01' 
GROUP BY a.underlying, a.expiration_date 
ORDER BY spread_profit_ratio DESC 
+0

その可能で行うにはSQL。 –

答えて

0

私はあなたが何をしようとして、100%確実ではないんだけど、答えはおそらく次のようになります。

select a.underlying 
, a.expiration_date 
, max(a.strike - b.strike) as spread 
from mytable a 
join mytable b on a.underlying = b.underlying 
      and a.expiration_date = b.expiration_date 
where a.option_type = 'foo' 
and b.option_type = 'bar' 
group by a.underlying, a.expiration_date 
+0

あなたの答えに基づいて私の質問を編集しましたが、インライン計算の仕方(spread_profit、spread_distance、spread_max_loss、spread_profit_ratio)がわかりません – jodu

+0

"old-school"に行き、場所。たとえば、spread_max_lossは(a.mid-b.mid) - (a.strike-b.strike)になります。あるいは、PL/pgSQLでこれを行うための関数を書くことができると思いますが、それは私が知る限りではありません。 –

関連する問題