SQL Server 分组依据子句并显示所有列 [已关闭]

SQL Server group by clause and display all columns [closed]

提问人:Sunil 提问时间:5/28/2015 最后编辑:CœurSunil 更新时间:7/16/2017 访问量:441

问:


想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。

8年前关闭。

我在: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     

我需要为每个 和 获取最高。 输出应如下所示:MarksGradeIDName

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

这是我尝试过的

从 T1 中选择 Id、Name、Grade、Marks 其中的分数(按等级从 T1 分组中选择最大(分数))

这太不成熟了,以至于我不想在这里发布它,我不知道其他方法可以尝试它......

sql-server

评论

2赞 Karthikeyan 5/28/2015
请提及您尝试解决这个问题的方法?这似乎是你的功课。我们不能做你的功课。
1赞 ughai 5/28/2015
帮助您入门的内容,请阅读 ROW_NUMBER()
1赞 Tanner 5/28/2015
可能的重复项:stackoverflow.com/questions/14261129/get-max-values-per-group
1赞 Giorgi Nakeuri 5/28/2015
这个问题有什么问题??Op 已经清楚地说明了他的问题。这里有什么不清楚的?
0赞 tjeloep 5/28/2015
...但OP没有表现出他/她的努力。

答:

0赞 Amir Pelled 5/28/2015 #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
4赞 Giorgi Nakeuri 5/28/2015 #2

你可以像这样做:

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

评论

0赞 Christian Barron 5/28/2015
这在我看来是正确的,所以我已经接受了。
0赞 t-clausen.dk 5/28/2015
对不起,误读了这个问题。我会改变我的反对票
1赞 Thomas 5/28/2015 #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

评论

0赞 Sunil 9/1/2016
谢谢,这解决了我的问题
-1赞 Dhaval 5/28/2015 #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

工作演示