外部在SQLAlchemy中的应用

我想使用下面的SQLAlchemy编写一个SQL Server的外部应用查询。

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表是一个具有有效日期,货币和Close_列的时间序列。EffectiveDate是主键。
  • FX表具有FromCurrCode,ToCurrCode,ExRateDate和Rate列。主键是(FromCurrCode,ToCurrCode,ExRateDate)
  • 我的用例是联接PRICE和FX表以获得美元价格。但是,对于PRICE表中给定的有效日期,该日期FX表中可能没有行。因此,不能使用FX.ExRateDate = PRICE.EffectiveDate直接联接表。要解决此问题,我需要使用OUTER APPLY在FX表中找到FX.ExRateDate最接近PRICE.EffectiveDate的最后一行。

似乎SQLAlchemy不支持外部Apply表达式。我看了看自定义SQL构造和编译扩展但是我不确定如何创建外部应用的自定义构造。你有例子吗?

我猜想一种解决方法是将外部应用替换为外部联接。如果可以提供一个查询,而无需使用外部应用,则可以产生相同的结果,那也将解决我的问题。

谢谢

这里使用相关子查询是使用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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章