2016-12-22 42 views
0

我正在使用以下查詢計算兩個日期之間所有訂單號之間的營業日。 Teradata表Common_WorkingCalendar中已有工作日。但是,我在執行查詢時也面臨假脫機空間問題。我的數據實驗室擁有充足的空間。需要優化查詢。欣賞任何輸入。運行子查詢時Teradata閥芯空間問題,計數爲

SELECT 
tx."OrderNumber", 
(SELECT COUNT(1) FROM Common_WorkingCalendar 
WHERE CalDate between Cast(tx."TimeStamp" as date) and Cast(mf.ShipDate as date)) as BusDays 
from StoreFulfillment ff 
inner join StoreTransmission tx 
      on tx.OrderNumber = ff.OrderNumber 
     inner join StoreMerchandiseFulfillment mf 
      on mf.OrderNumber = ff.OrderNumber 

回答

2

這是一種非常低效的方式來獲得導致產品加入的此計數。

建議的方法是在日曆中添加一個僅在工作日內增加的序列號(使用SUM(CASE WHEN businessDay THEN 1 ELSE 0 END) OVER (ORDER BY CalDate ROWS UNBOUNDED PRECEDING)計算),然後是兩個連接,即開始日期和結束日期。

如果需要此計算有很多你最好添加一個新的列,否則你可以做到這一點對飛:

WITH cte AS 
(
    SELECT CalDate, 
    -- as this table only contains business days you can use this instead 
    row_number(*) Over (ORDER BY CalDate) AS DayNo 
    FROM Common_WorkingCalendar 
) 
SELECT 
    tx."OrderNumber", 
    to_dt.DayNo - from_dt.DayNo AS BusDays 
FROM StoreFulfillment ff 
INNER JOIN StoreTransmission tx 
      ON tx.OrderNumber = ff.OrderNumber 
     INNER JOIN StoreMerchandiseFulfillment mf 
      ON mf.OrderNumber = ff.OrderNumber 
JOIN cte AS from_dt 
    ON from_dt.CalDate = Cast(tx."TimeStamp" AS DATE) 
JOIN cte AS to_dt 
    ON to_dt.CalDate = Cast(mf.ShipDate AS DATE)