结合MAX和SUM的SQL
因此,我有一个SQL表,其中包含以下列:结合MAX和SUM的SQL,sql,sql-server,sum,subquery,greatest-n-per-group,Sql,Sql Server,Sum,Subquery,Greatest N Per Group,因此,我有一个SQL表,其中包含以下列: License# - int Name - char(255) ActivityDate - datetime FundsIn - money,null 大约有2800个独特的许可证号码,每天将有大量资金。我正在试图找到上次有活动的日期(ActivityDate)以及在最大ActivityDate上所有资金的总和 下面是一个我一直试图修改以使其正常工作的查询,但它返回的是所有日期的许可证号之和,而不仅仅是最大日期 Select License, Nam
License# - int
Name - char(255)
ActivityDate - datetime
FundsIn - money,null
大约有2800个独特的许可证号码,每天将有大量资金。我正在试图找到上次有活动的日期(ActivityDate)以及在最大ActivityDate上所有资金的总和
下面是一个我一直试图修改以使其正常工作的查询,但它返回的是所有日期的许可证号之和,而不仅仅是最大日期
Select License, Name, MAX(ActivityDate), FundsIn
From (
Select License, Name, ActivityDate, SUM(FundsIn) as Funds_In
From Table1
group by License, Name, ActivityDate
) foo
group by License, Name, FundsIn
我知道当前查询的问题是它正在对FundsIn的整个数据集进行分组,但我不知道如何将FundsIn的总和限制为仅最大日期。任何帮助都将不胜感激
样本日期
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使用行号查找每个许可证的最大活动日期。然后,在许可证和活动日期(最大值)将CTE合并回表1
我想你在找这样的东西。CTE使用行号查找每个许可证的最大活动日期。然后,在许可证和活动日期(最大值)将CTE合并回表1
我知道您想要每个许可证在最新活动日期的资金总额(并非所有许可证每天都处于活动状态) 有多种方式来表达这一点。一种方法是具有相关子查询的筛选器:
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, name, activityDate
在其他选项中,一个更奇特的选择是按顺序排列的和带领带的顶部(1)
:
select top (1) with ties license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
group by license, name, activityDate
order by row_number() over(partition by license order by activityDate desc)
我认为第二种方法在大型数据集上的效率较低。我知道您希望每个许可证的最新活动日期的资金总额(并非所有许可证每天都处于活动状态)
有多种方式来表达这一点。一种方法是具有相关子查询的筛选器:
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, name, activityDate
在其他选项中,一个更奇特的选择是按
顺序排列的和带领带的顶部(1)
:
select top (1) with ties license, name, activityDate, sum(fundsIn) fundsIn
from mytable t
group by license, name, activityDate
order by row_number() over(partition by license order by activityDate desc)
我希望第二种方法在大型数据集上效率较低。请向我们展示示例数据和所需结果。到目前为止,有不止一种方式来解释你的问题。我认为你应该展示一些数据。但是如果不进行测试,我认为在选择中使用max
是不行的。您应该在having
命令中的groupby
之后添加MAX(ActivityDate)
。您描述的顺序正确,但您的代码是错误的。您应该首先计算最大活动日期,然后将其(连同名称
和许可证
)返回到表1
。您将只剩下最新的记录。然后你可以计算资金总额。请向我们展示样本数据和期望的结果。到目前为止,有不止一种方式来解释你的问题。我认为你应该展示一些数据。但是如果不进行测试,我认为在选择中使用max
是不行的。您应该在having
命令中的groupby
之后添加MAX(ActivityDate)
。您描述的顺序正确,但您的代码是错误的。您应该首先计算最大活动日期,然后将其(连同名称
和许可证
)返回到表1
。您将只剩下最新的记录。然后,您可以获取资金总额。这似乎只提取整个数据集中的最后一个活动日期,而不是每个许可证的最后一个活动日期。它现在已更新。max ActivityDate是每个许可证的当前最大活动日期这似乎只提取整个数据集中的最后一个活动日期,而不是每个许可证的最后一个活动日期。它现在已更新。现在每个许可证的最大活动日期似乎就是我要找的!非常感谢。我稍微修改了一下,以排除FundsIn=0的最后一个活动日期。它似乎在按预期工作。我添加的where子句会导致任何问题吗?现在运行良好。再次感谢从表t中选择许可证、名称、活动日期、金额(FundsIN)作为FundsIN,其中t.ActivityDate=(从表t1中选择max(t1.ActivityDate),其中t1.License=t.License和t1.FundsIN>0)按许可证、名称、活动日期顺序按活动日期描述、FundsIN描述、许可证“”’分组,这似乎就是我要找的!非常感谢。我稍微修改了一下,以排除FundsIn=0的最后一个活动日期。它似乎在按预期工作。我添加的where子句会导致任何问题吗?现在运行良好。再次感谢从表t中选择许可证、名称、ActivityDate、总和(FundsIN)作为FundsIN,其中t.ActivityDate=(从表t1中选择最大值(t1.ActivityDate),其中t1.License=t.License和t1.FundsIN>0)按许可证、名称、ActivityDate顺序按ActivityDate描述、FundsIN描述、许可证“”分组