Performant SQL Join检索最近的事件



我在Teradata
T1中有两个表:项目/位置/日期级别的销售数据T2:项目/地点/日期级别的价格变化数据。

我需要一个高性能(因为在这个级别上可能有数百万条记录)的方法来连接这些,以从T1(受日期限制)和该项目/位置/日期组合的最近价格变化中提取所有记录。

T1| Itm | Loc | | ||-----|-----|------|-------|| 1 | a | 1/1 | 100 |
| 1 | a | 1/2 | 200 |
| 1 | b | 1/1 | 75 |
| 1 | b | 1/3 | 50 |

T2| Itm | Loc | | |价格日期
|-----|-----|-------|-------|| 1 | a | 12/30 | 5.5 || 1 | a | 1/2 | 5 |
| 1 | b | 11/1 | 6 || 1 | b | 1/2 | 7.5 |

结果|商品|地点|日期|销售|价格||-----|-----|------|-------|---|1 | a | 1/1 | 100 | 5.5 || 1 | a | 1/2 | 200 | 5 || 1 | b | 1/1 | 75 | 6 || 1 | b | 1/3 | 50 | 7.5 |

我已经尝试创建了一个交叉连接的驱动表(itm/日期/位置笛卡尔),但它太多了。我已经尝试了ROW_NUMBER()来获取最近的价格变化,但我必须在每个记录上都这样做,但我认为这让我更接近。我也试着做一个价格变化的CTE,但不知道如何加入,所以我从价格变化表中获得最近的事件。比如…

WITH CTE AS ( 
SELECT ROW_NUMBER() OVER (PARTITION BY PRICE.ITM, PRICE.LOCATION ORDER BY PRICE.DATE DESC) AS RN,
PRICE.NEWPRICE
FROM T2
)
SELECT 
ITEM,
LOCATION,
DATE,
SALES,
(SELECT NEWPRICE FROM CTE WHERE T1.ITEM = T2.ITEM AND T1.LOCATION =T2.LOCATION AND T1.DATE>=T2.DATE)
FROM T1

我明白了。我坚持使用CTE,并在分区上延迟了之前的日期。然后加入销售日期之间的价格变化,包括开始。我知道这不是最有效的方法,但它是有效的。如有任何改进,我们仍将感激不尽。

WITH CTE AS ( DATE,
ITEM,
LOCATION, 
NEW PRICE,
LAG DATE OVER ( PARTITIONS ITM, LOCATION, ORDER BY DATE DESC) AS PREVIOUS_PRICE_DATE
FROM PRICETABLE) P
SELECT LOCATION, 
DATE,
ITEM,
SALES,
PRICE
FROM SALESTABLE S
LEFT JOIN CTE
ON S.LOCATION = P.LOCATION
AND S.ITEM =P.ITEM
AND S.DATE >= P.DATE
AND S.DATE < P.PREVIOUS_PRICE_DATE

最新更新