SQL SERVER QUERY选择每个项目的最大值记录

ric*_*mer 3 sql sql-server temp-tables sql-server-2008

这是样本表

在此输入图像描述

我需要实现的是仅获取或显示月份值最高的租户记录.如果月份相等,我需要根据最新的日期值.这是所需的输出样本

在此输入图像描述

有了这个,我开始使用这个代码使用max函数并合并临时表,但无法获得所需的结果.

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


select * 
from  #sample  
where months = (select max(months)from #sample)
Run Code Online (Sandbox Code Playgroud)

并输出到这样的东西.我相信,代码在整个列表中获得最大值而不考虑每个租户过滤.

在此输入图像描述

任何帮助将不胜感激 :)

sst*_*tan 7

这可以通过row_number窗口函数完成:

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
Run Code Online (Sandbox Code Playgroud)

  • 对于每个不同的`tenant/name`(`partition by`子句),`row_number`函数将按顺序编号行`1,2,3,4,...`,*始终以`1`*开头,使用`order by`子句来确定序列.因此,因为`order by`子句设置为`t.months desc,t.date desc`,对于每个`tenant/name`组合,具有最大`months`值的行(和最新`date`如果更多比一行具有相同的`months`值)将具有`1`的`rn`值. (2认同)

Ull*_*las 5

你可以使用一个row_number功能.

询问

;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;
Run Code Online (Sandbox Code Playgroud)

  • 在逻辑或执行方面,我没有看到在这个例子中使用CTE有任何改进; 但是,IMO,CTE使查询比内联视图更容易阅读,因此我通常更喜欢使用CTE. (4认同)
  • CTE可以递归使用; 子查询不能.这使它们特别适合树形结构.http://stackoverflow.com/questions/706972/difference-between-cte-and-subquery (2认同)