结合MAX和SUM的SQL

问题描述

所以我有一个包含以下各列的sql表:

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 bytop (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) 

我希望第二种方法在大型数据集上效率较低。