在表B上连接表A,并从表A中的特定日期之后仅选择B中的第一个匹配项

时间:2017-11-20 21:55:50

标签: sql teradata

我试图确定执行以下操作的最佳方法....表a具有特定的start_date。表b有一堆美元金额,根据收到的付款和时间的不同日期。我只想显示表b中的第一个日期> =表a中的start_date。我也不想检索重复的ID号码,这就是我现在遇到的情况。

到目前为止我有这样的事情......

Select a.ID, a.Start_Date
From a
Left Join (Select ID, Min(Recd_Dt) as Mindate, Total_Recd
Group by ID, Total_Recd) b on a.ID = b.ID and a.Start_Date <= b.Mindate

表a看起来像这样......

ID | Start_Dt  
1  | 11/2/2017  
2  | 11/3/2017  

表b看起来像这样......

ID | Recd_Dt    | Total_Recd  
1  | 11/1/2017  | $600  
1  | 11/10/2017 | $800  
1  | 11/19/2017 | $100  
2  | 11/2/2017  | $200  
2  | 11/5/2017  | $600  
2  | 11/6/2017  | $100

我喜欢看到这样的东西......

ID | Recd_Dt    | Total_Recd  | Sum_of_Total_Recd_After_Start  
1  | 11/10/2017 | $800        | $900  
2  | 11/5/2017  | $600        | $700

此外,我还想在同一张桌子b上进行第二次加入,这将为我提供在Start_Date之后发生的任何金额的总和

1 个答案:

答案 0 :(得分:0)

尝试一下:

SELECT 
    a.ID, 
    b.Recd_Dt, 
    b.Total_Recd, 
    SUM(Total_Recd) OVER(PARTITION BY a.ID) AS Sum_of_Total_Recd_After_Start 
FROM a
INNER JOIN b ON a.ID = b.ID AND b.Recd_Dt > a.Start_Dt
QUALIFY ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY b.Start_Dt) = 1

1)从表“a”获取所有行 2)从表“b”获取与Recd_Dt相关的行&gt; Start_Dt
3)ROW_NUMBER按每个ID的最早Start_Dt排序行 4)QUALIFY ... = 1仅保留每个ID分组的第一行
5)SUM(Total_Recd)将每个ID分组的Total_Recd列相加

我没有测试过,但请告诉我它是否有效。