0

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

FX 表中可能没有 price 表中日期的对应行,所以我需要使用 to 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_ 列的时间序列。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。但我不确定如何创建外部应用的自定义构造。你有例子吗?

我想一种解决方法是用外部联接替换外部应用。如果您可以提供查询可以在不使用外部应用的情况下产生相同的结果,那也可以解决我的问题。

谢谢

4

1 回答 1

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)
于 2016-11-25T12:30:27.953 回答