SQLAlchemy 中的外部应用
OUTER APPLY in SQLAlchemy
我想使用 SQLAlchemy 编写一个 SQL 服务器的外部应用查询,如下所示。
FX table 可能在价格 table 中没有日期对应的行,所以我需要使用 OUTER APPLY 来获取 FX [=37= 中的最后一行] 每个日期。
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
table 的简要背景:
- PRICE table 是一个包含 EffectiveDate、Currency 和 Close_ Column 的时间序列。 EffectiveDate 是主键。
- FX table 具有 FromCurrCode、ToCurrCode、ExRateDate 和 Rate 列。主键是 (FromCurrCode, ToCurrCode, ExRateDate)
- 我的用例是加入 PRICE 和 FX tables 以获得美元价格。但是,对于 PRICE table 中给定的 EffectiveDate,该日期在 FX table 中可能没有行。因此,table 不能直接与 FX.ExRateDate = PRICE.EffectiveDate 连接。要解决此问题,我需要使用 OUTER APPLY 来查找 FX table 中的最后一行,即 FX.ExRateDate 最接近 PRICE.EffectiveDate
似乎 SQLAlchemy 不支持外部应用表达式。我看了一下Custom SQL Constructs and Compilation Extension。但我不确定如何创建外部应用的自定义构造。你有这方面的例子吗?
我想一个解决方法是用外部连接替换外部应用。如果你能提供一个不使用外部应用也能产生相同结果的查询,那也能解决我的问题。
谢谢
使用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)
我想使用 SQLAlchemy 编写一个 SQL 服务器的外部应用查询,如下所示。
FX table 可能在价格 table 中没有日期对应的行,所以我需要使用 OUTER APPLY 来获取 FX [=37= 中的最后一行] 每个日期。
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
table 的简要背景:
- PRICE table 是一个包含 EffectiveDate、Currency 和 Close_ Column 的时间序列。 EffectiveDate 是主键。
- FX table 具有 FromCurrCode、ToCurrCode、ExRateDate 和 Rate 列。主键是 (FromCurrCode, ToCurrCode, ExRateDate)
- 我的用例是加入 PRICE 和 FX tables 以获得美元价格。但是,对于 PRICE table 中给定的 EffectiveDate,该日期在 FX table 中可能没有行。因此,table 不能直接与 FX.ExRateDate = PRICE.EffectiveDate 连接。要解决此问题,我需要使用 OUTER APPLY 来查找 FX table 中的最后一行,即 FX.ExRateDate 最接近 PRICE.EffectiveDate
似乎 SQLAlchemy 不支持外部应用表达式。我看了一下Custom SQL Constructs and Compilation Extension。但我不确定如何创建外部应用的自定义构造。你有这方面的例子吗?
我想一个解决方法是用外部连接替换外部应用。如果你能提供一个不使用外部应用也能产生相同结果的查询,那也能解决我的问题。
谢谢
使用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)