问题描述
License# - int
Name - char(255)
ActivityDate - datetime
FundsIn - money,null
有约2800个唯一的许可证号,每天将有大量资金。我正在尝试查找活动(ActivityDate)的最后日期以及该MAX ActivityDate上所有FundsIn的总和。
以下是我一直在尝试修改的查询,以使其正常工作,但它返回的是所有日期的许可证号的总和,而不仅仅是MAX日期。
Select License,Name,MAX(ActivityDate),FundsIn
From (
Select License,ActivityDate,SUM(FundsIn) as Funds_In
From Table1
group by License,ActivityDate
) foo
group by License,FundsIn
我知道当前查询的问题是它正在对FundsIn的整个数据集进行分组,但是我不知道如何将FundsIn的总和限制为仅MAX日期。任何帮助将不胜感激。
采样日期
License Name ActivityDate FundsIn
123 A 8/29/2020 40
123 A 8/29/2020 60
123 A 8/29/2020 80
123 A 8/29/2020 55
123 A 8/30/2020 10
123 A 8/30/2020 15
123 A 8/30/2020 12
123 A 8/30/2020 60
123 A 8/30/2020 70
234 B 8/29/2020 12
234 B 8/29/2020 15
234 B 8/29/2020 19
234 B 8/29/2020 22
234 B 8/29/2020 33
234 B 8/30/2020 13
234 B 8/30/2020 78
234 B 8/30/2020 28
234 B 8/30/2020 34
234 B 8/30/2020 46
License Name ActivityDate FundsIn
123 A 8/30/2020 167
234 B 8/30/2020 199
解决方法
我认为您正在寻找这样的东西。 CTE使用row_number查找每个许可证的最大ActivityDate。然后,将CTE加入到License和ActivityDate(最大)上的Table1中。
;with max_cte as (
select *,row_number() over (partition by License order by activityDate desc) rn from Table1 t)
Select License,Name,ActivityDate,SUM(FundsIn) as Funds_In
From max_cte mc
join Table1 t on mc.License=t.License
and mc.ActivityDate=t.ActvityDate
where mc.rn=1
group by License,ActivityDate;
,
我了解您想要每个许可证最近一次活动日期的资金总额 (并非每天都有可能激活所有许可证)。
有多种表达方式。一种方法是使用具有相关子查询的过滤器:
select license,name,activityDate,sum(fundsIn) fundsIn
from mytable t
where t.activityDate = (select max(t1.activityDate) from mytable t1 where t1.license = t.license)
group by license,activityDate
除其他选项外,更order by
和top (1) with ties
更为奇特:
select top (1) with ties license,sum(fundsIn) fundsIn
from mytable t
group by license,activityDate
order by row_number() over(partition by license order by activityDate desc)
我希望第二种方法在大型数据集上效率较低。