【问题标题】:SQL SERVER QUERY to select max value record per itemSQL SERVER QUERY 选择每个项目的最大值记录
【发布时间】:2016-01-04 17:41:29
【问题描述】:

这是示例表

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

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

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


select * 
from  #sample  
where months = (select max(months)from #sample)

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

任何帮助将不胜感激:)

【问题讨论】:

    标签: sql sql-server sql-server-2008 temp-tables


    【解决方案1】:

    这可以通过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
    

    【讨论】:

    • 这行得通。我能问一下,rn总是回到1吗?
    • 对于每个不同的tenant/name 集合(partition by 子句),row_number 函数将对行按顺序编号1,2,3,4,...始终以1 开头 ,使用order by 子句来确定顺序。因此,因为order by 子句设置为t.months desc, t.date desc,对于每个tenant/name 组合,具有最大months 值的行(如果多行具有相同的months 值,则最新date)将有一个rn1
    • 为了更好地理解这一点,请尝试单独运行子查询,以便您可以看到所有行的 rn 值。
    【解决方案2】:

    您可以使用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;
    

    【讨论】:

    • 与子查询相比,使用公用表表达式有什么优势吗(如另一个答案中所做的那样)?
    • 一个CTE可以递归使用;子查询不能。这使得它们特别适合树结构。 stackoverflow.com/questions/706972/…
    • @Ajmot 好的,谢谢,但要明确一点,在这个特定的应用程序中不需要递归,对吧?
    • 另一种差异CTE可以多次作为不同的表替代,子查询只能使用一次
    • 我没有看到在这个例子中使用 CTE 在逻辑或执行方面有任何改进;但是,IMO,CTE 使查询比内联视图更易于阅读,因此我通常更喜欢使用 CTE。
    猜你喜欢
    • 2019-04-13
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多