【问题标题】:SQL:How do i get the row that has the max value of a column in SQL ServerSQL:如何获取 SQL Server 中列的最大值的行
【发布时间】:2015-12-31 09:01:39
【问题描述】:

我有一个数据集,该数据集已按 PersonClass 列分组,我将此查询用于此过程:

SELECT Person,Class, MAX(TimeSpent) as MaxTimeSpent 
FROM Persons 
GROUP BY Person,Class

输出:

Person   Class    MaxTimeSpent 
--------|--------|-------------|
MJ      |   0    | 0           |
MJ      |   1    | 659         |
MJ      |   2    | 515         |

我想要做的是获取此数据集中具有最大Class 值的行(本例中为第 3 行)。

我该怎么做?任何帮助,将不胜感激。

【问题讨论】:

  • @StuartLC TOP 1 不会工作,因为我使用 WHERE caluse 可以更轻松地测试我的查询。
  • 在这种情况下,搜索 Group Wise Maximum - 一个好的策略是使用分区对数据进行分组并使用ROW_NUMBER(无关联)或RANK(有关联)来编号每个组中的行,按Class 排序,然后只过滤掉 Row / Rank = 1 行。

标签: sql sql-server group-by greatest-n-per-group


【解决方案1】:

试试这个

SELECT T.*
FROM
    (SELECT Person,
           Class,
           MAX(TimeSpent) AS MaxTimeSpent 
    FROM Persons AS P
    WHERE Person = 'MJ'
    GROUP BY Person, Class) AS T
WHERE T.class = (
      SELECT MAX(class) FROM Persons AS P
      WHERE P.person = T.person)

【讨论】:

  • 嗨@fabulaspb,是的。不错的一个
【解决方案2】:

你可以使用 cte。

 declare @Persons table (person nvarchar(10),Class int ,TimeSpent int)

insert into @Persons
select 'MJ',0,0 union all
select 'MJ',1,659 union all
select 'MJ',2,515 


;with cte
as(
SELECT Person,Class,TimeSpent , row_number() over(partition by Person  order by Class desc )  as RN
FROM @Persons 
)
select * from cte where RN=1

解决方案2:没有Cte:

SELECT * FROM (
    SELECT Person
        ,Class
        ,TimeSpent
        ,row_number() OVER (PARTITION BY Person ORDER BY Class DESC) AS RN FROM @Persons
    ) t WHERE t.RN = 1

【讨论】:

    【解决方案3】:

    试试这个:

    declare @t table (Person  varchar (20),Class    int ,MaxTimeSpent int )
    insert into @t VALUES ('MJ',0,0)
    insert into @t VALUES ('MJ',1,659)
    insert into @t VALUES ('MJ',2,515)
    
    SELECT TOP 1 * FROM @t ORDER BY 2 DESC
    
    --OR
    SELECT * FROM @t WHERE Class = (SELECT max(class) FROM @t)
    
    -- OR
    SELECT TOP 1 * FROM (
        SELECT *
            ,ROW_NUMBER() OVER (PARTITION BY person ORDER BY Class DESC) Record_Count FROM @t
        ) a
    

    【讨论】:

      【解决方案4】:

      SELECT Top 1 Person,Class, MAX(TimeSpent) as MaxTimeSpent 从人 GROUP BY Person,Class order by Class desc

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多