【问题标题】:SQL Server group by clause and display all columns [closed]SQL Server group by子句并显示所有列[关闭]
【发布时间】:2015-08-10 15:44:26
【问题描述】:

我在SQL Server有一张这样的桌子:

Id Name Grade Marks 
1  ABC  8     150
1  DEF  9     200
2  GHI  10    180
2  JKL  8     155
3  MNO  9     150
3  PQR  10    200     

我需要为每个Grade 以及IDName 获取最高的Marks。 输出应该是这样的:

Id  Name   Grade  Marks
2   JKL    8      155
1   DEF    9      200
3   PQR    10     200 

这是我尝试过的

从 T1 中选择 ID、姓名、年级、分数 where 分数在 (select max(marks) from T1 group by Grade)

这个尝试太不成熟了,我勉强把它贴在这里,我不知道其他方法可以尝试......

【问题讨论】:

  • 请提及您尝试解决此问题的方式?这似乎是你的功课。我们不能帮你做作业。
  • 帮助您入门的东西,阅读ROW_NUMBER()
  • 这个问题有什么问题?? Op已经清楚地说明了他的问题。这里有什么不清楚的地方?
  • ...但是 OP 没有表现出他/她的努力。

标签: sql sql-server


【解决方案1】:
select ID, Name, Grade, Mark
FROM (select ID, Name, Grade, Mark, 
      Row_number() over(partition by Grade order by mark desc) AS RN
      From <Table> ) A
WHERE RN = 1

【讨论】:

    【解决方案2】:

    你可以这样做:

    ;with cte as
    (
      select 
        *, 
        row_number() over(partition by Grade order by Marks desc) rn
      from TableName
    )
    select * from cte where rn = 1
    

    【讨论】:

    • 这对我来说很合适,所以我已经升级了。
    • 抱歉误读了这个问题。我会改变我的反对票
    【解决方案3】:
    SELECT 
        t1.ID
        ,t1.NAME
        ,t1.Grade
        ,t1.Marks
    FROM t1
    INNER JOIN (
        SELECT Grade
            ,max(Marks) AS highest_marks
        FROM t1
        GROUP BY Grade
        ) AS TEMP ON t1.Marks = TEMP.highest_marks
        AND t1.Grade = TEMP.Grade
    

    【讨论】:

    • 谢谢,这解决了我的问题
    【解决方案4】:

    这不是最好的方法,但你可以试试这个。!!

    with cte as
    (
    select id,max(marks)as m from test group by id
    )
    select t.id,t.sub,t.grade,t.marks from test t 
    inner join cte c on c.id=t.id and t.marks=c.m
    

    working demo

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      相关资源
      最近更新 更多