2016-11-25 2 views
0

SQLAlchemy를 사용하여 아래처럼 SQL Server의 외부 적용 쿼리를 작성하고 싶습니다.SQLAlchemy에서 바깥 쪽 적용

FX 테이블에 가격 테이블의 날짜에 해당 행이 없을 수 있으므로 각 날짜에 대해 FX 테이블의 마지막 행을 가져 오려면 OUTER APPLY에 사용해야합니다. 테이블에

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 

간단한 배경 :

  • 가격 표는 EFFECTIVEDATE, 통화 및 Close_ 열이있는 시계열이다. EffectiveDate가 기본 키입니다.
  • FX 테이블에는 FromCurrCode, ToCurrCode, ExRateDate 및 Rate 열이 있습니다. 기본 키는 (FromCurrCode, ToCurrCode, ExRateDate)
  • 입니다.이 유스 케이스는 USD 가격을 얻기 위해 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)