在SQLAlchemy中应用外部

时间:2016-11-25 06:44:44

标签: python sql sql-server sqlalchemy outer-apply

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

似乎SQLAlchemy不支持外部应用表达式。我看了Custom SQL Constructs and Compilation Extension。但我不知道如何创建外部应用的自定义构造。你有一个例子吗?

我想解决方法是用外连接替换外部应用。如果你可以提供一个查询可以产生相同的结果而不使用外部应用,那也可以解决我的问题。

由于

1 个答案:

答案 0 :(得分:0)

使用Correlated Subquery这里是使用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)