SQL SERVER查询以选择每个项目的最大值记录

SQL SERVER查询以选择每个项目的最大值记录,sql,sql-server,sql-server-2008,temp-tables,Sql,Sql Server,Sql Server 2008,Temp Tables,这是示例表 我需要实现的是只获取或显示月值最高的租户记录。如果月份相等,我需要基于最新的日期值。下面是所需输出的示例 有了这个,我使用max函数和合并的temp表开始了这段代码,但无法得到期望的结果 select tenant, name, date, month into #sample from tenant select * from #sample where months = (select max(months)from #sample) 然后输出到类似这样的东西

这是示例表

我需要实现的是只获取或显示月值最高的租户记录。如果月份相等,我需要基于最新的日期值。下面是所需输出的示例

有了这个,我使用max函数和合并的temp表开始了这段代码,但无法得到期望的结果

select tenant, name,  date, month
into #sample
from tenant


select * 
from  #sample  
where months = (select max(months)from #sample)
然后输出到类似这样的东西。正如我所相信的,代码在整个列表中获得最大值,而不考虑每个租户的筛选


任何帮助都将不胜感激:)

这可以通过
行号
窗口功能完成:

select tenant, name, date, months
  from (select t.*,
               row_number() over (partition by t.tenant, t.name order by t.months desc, t.date desc) as rn
          from TableName t) x
 where rn = 1

您可以使用
行号
功能

查询

;with cte as 
(
    select rn = row_number() over 
    (
        partition by tenant
        order by months desc,[date] desc
    ),*
    from table_name
)
select tenant,name,[date],months from cte
where rn = 1;

与子查询相比,使用公共表表达式是否有任何优势(如在另一个答案中所做的);无法创建子查询。这使得它们特别适合于树结构@Ajmot好的,谢谢,但要明确的是,在这个特定的应用程序中不需要递归,对吗?另一个不同的CTE可以多次用作不同的表替换,子查询只能在我看不到在这个示例中使用CTE在逻辑或执行方面有任何改进的情况下使用;然而,在IMO中,CTE使查询比内联视图更容易阅读,所以我通常更喜欢使用CTE。我可以问一下,rn是否总是返回到1?对于每一组不同的
租户/名称
子句划分),
行编号
函数将按顺序对行
1,2,3,4,
,始终从
1
开始,使用
order by
子句确定顺序。因此,由于
orderby
子句设置为
t.months desc,t.date desc
,因此对于每个
tenant/name
组合,具有最大
months
值的行(如果多行具有相同的
months
值,则为最新的
date
)将具有
rn
1
。为了更好地理解这一点,请尝试单独运行子查询,以便可以查看所有行的
rn
值。