我试图确定执行以下操作的最佳方法....表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之后发生的任何金额的总和
答案 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列相加
我没有测试过,但请告诉我它是否有效。