2016-11-25 10 views
0

SQLAlchemyを使用して以下のようなSQL Applyの外部適用クエリを作成します。SQLAlchemyでOUTERが適用されます

FXテーブルには価格表の日付に対応する行がない可能性がありますので、OUTER APPLYを使用して各日付のFXテーブルの最後の行を取得する必要があります。テーブル上の

SELECT p.EffectiveDate, p.Close_ * FX.Rate as USD_PRICE 
FROM PRICE p 
OUTER APPLY (
    SELECT TOP 1 * 
    FROM FX 
    WHERE 
     FromCurrency = p.Currency 
     AND ToCurrency = 'USD' 
     AND ExRateDate <= p.EffectiveDate 
    ORDER BY ExRateDate DESC 
) fx 

簡単な背景:

  • PRICEテーブルはEffectiveDate、通貨およびClose_列を持つ時系列です。 EffectiveDateが主キーです。
  • FXテーブルには、FromCurrCode、ToCurrCode、ExRateDate、およびRate列があります。主キーは(FromCurrCode、ToCurrCode、ExRateDate)
  • です。私の使用例は、米ドル価格を得るためにPRICEテーブルとFXテーブルに参加することです。ただし、PRICEテーブル内の特定のEffectiveDateについては、その日にFXテーブルに行が存在しないことがあります。したがって、テーブルをFX.ExRateDate = PRICE.EffectiveDateで直接結合することはできません。この問題を解決するには、私は

SQLAlchemyのは、外側の適用表現をサポートしていないようだOUTERがFX.ExRateDateがPRICE.EffectiveDateに最も近いFX表の最後の行を見つけるには適用され使用する必要があります。私はCustom SQL Constructs and Compilation Extensionを見ました。しかし、私はどのように外部適用のカスタム構築を作成するか分からない。あなたはその事例を持っていますか?

私は、外部のアプリケーションを外部のアプリケーションに置き換えることで回避すると思います。あなたが外側の適用を使わずに同じ結果を生成することができるクエリを提供することができれば、それも私の問題を解決するでしょう。ここCorrelated Subqueryを使用して

おかげ

答えて

0

OUTER JOINを使用してソリューションです:

sq = (
    session.query(FX.id.label("last_id")) 
    .filter(FX.FromCurrency == Price.Currency) 
    .filter(FX.ToCurrency == 'USD') 
    .filter(FX.ExRateDate <= Price.EffectiveDate) 
    .order_by(FX.ExRateDate.desc()) 
    .order_by(FX.id.desc()) # handle duplicates just in case 
    .limit(1) 
    .correlate(Price) 
    .as_scalar() 
) 

q = session.query(
    Price.EffectiveDate, 
    (Price.Close_ * FX.Rate).label("USD_PRICE"), 
).outerjoin(FX, FX.id == sq) 
関連する問題