Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server select与聚合函数_Sql_Sql Server_Select - Fatal编程技术网

SQL Server select与聚合函数

SQL Server select与聚合函数,sql,sql-server,select,Sql,Sql Server,Select,我有一个表,看起来像这样这只是一些记录,它们也有更多的列,但这些是我关心的: nbr amt date 1 10 10/30/2012 1 15 1/30/2012 1 50 11/30/2012 2 10 4/30/2012 2 1000 5/30/2012 2 45 1/15/2012 4 90 12/30/2012 4 8

我有一个表,看起来像这样这只是一些记录,它们也有更多的列,但这些是我关心的:

nbr    amt     date     
1      10      10/30/2012
1      15      1/30/2012
1      50      11/30/2012
2      10      4/30/2012
2      1000    5/30/2012
2      45      1/15/2012
4      90      12/30/2012
4      89      8/30/2012
3      100     7/30/2012
我正在尝试使用SQL Server 2012为每个nbr选择对应于最大金额的nbr、金额和日期

到目前为止,我有这样一个查询,它按nbr对其进行分组并选择maxamt,但它不允许我选择日期,因为它不在聚合函数中,但如果我将它放在聚合函数中,它会选择maxdate,而maxdate与金额随附的实际日期不对应:

,topamt as (
select 
                 nbr
    ,amt
    ,date
,amtrank = row_number() over (partition by ah.member_nbr order by ah.tran_amt desc)

from HISTORY ah 
      amt>=10
and id=6061
and date between '11-01-2012' and '12-31-2012'

因此,如果我将查询更改为此处,我在何处定义它以获取最大值,则结果至少不会显示最大值。

尝试使用排名函数:

with TopAmt as
(
  select *
  , amtRank = row_number() over (partition by nbr order by amt desc)
)
select nbr
  , amt
  , date
from TopAmt
where amtRank = 1

尝试使用排名函数:

with TopAmt as
(
  select *
  , amtRank = row_number() over (partition by nbr order by amt desc)
)
select nbr
  , amt
  , date
from TopAmt
where amtRank = 1

+1,这将始终检索一条记录。如果有多条记录的每个nbr的最大金额相同,则op可以使用秩而不是行数。我不知道这是否是问题所在,但我正在查看的表有3列以上,这些正是我关心的。我得到一个错误:多次为指定了nbrtopamt@Lamak提出了一个很好的观点;如果您担心出现平局,您可以在over条款中包含日期,例如按nbr订单按amt desc划分,date将返回第一次出现的最大金额。是的,我有行\号超额分配。。。before and yes它检索一条记录,但没有选择最大值。请查看我为u建议的+1编辑的上面的问题/查询,这将始终检索一条记录。如果有多条记录的每个nbr的最大金额相同,则op可以使用秩而不是行数。我不知道这是否是问题所在,但我正在查看的表有3列以上,这些正是我关心的。我得到一个错误:多次为指定了nbrtopamt@Lamak提出了一个很好的观点;如果您担心出现平局,您可以在over条款中包含日期,例如按nbr订单按amt desc划分,date将返回第一次出现的最大金额。是的,我有行\号超额分配。。。before and yes可检索一条记录,但未选择最大值。请查看我编辑的上述问题/查询,了解我认为你的建议如果你有两天发生的相同最大值,您是想要第一次达到该金额还是最近达到该金额的时间?如果您在两个不同的日期拥有相同的最大金额,则无论哪一个更容易实现都无所谓,您是希望第一次达到该金额还是最近一次达到该金额?无论哪一次更容易实现都无所谓