请教一个SQL语句的写法,非常感谢!

edgethinking 2018-11-27 12:47:47
--数据如下:
Create Table #Score
(
[课程] varchar(10),
[人员] varchar(10),
[分数] int
)
Insert into #Score
Select '语文','A', 96 union all
Select '数学','C', 93 union all
Select '语文','B', 99 union all
Select '语文','C', 80 union all
Select '数学','A', 88 union all
Select '数学','B', 84

--想要得到如下结果(得到每门课程的前2名,要求一个SQL语句,因为我实际应用中类似[课程]和[人员]都有几千种)。
'语文','B', 99
'语文','A', 96
'数学','C', 93
'数学','A', 88

--请问这个SQL语句应该怎么写?非常感谢!
...全文
104 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2018-11-27
  • 打赏
  • 举报
回复
IF OBJECT_ID('tempdb..#Score') IS NOT NULL
	DROP TABLE #Score
--数据如下:
Create Table #Score
(
  [课程] varchar(10),
  [人员] varchar(10),
  [分数] int
)
SET NOCOUNT ON
Insert into #Score
Select '语文','A', 96 union all
Select '数学','C', 93 union ALL
Select '语文','B', 99 union all
Select '语文','C', 80 union all
Select '数学','A', 88 union all
Select '数学','B', 84

SELECT * FROM (
SELECT 
--dense_rank 允许同一分数并列第一
--ROW_NUMBER 同一分数不并列第一
dense_rank() OVER (PARTITION BY s.[课程] ORDER BY s.[分数] DESC) AS rid
,*
FROM #Score AS s
) AS tt
WHERE rid<=2
/*
rid                  课程         人员         分数
-------------------- ---------- ---------- -----------
1                    数学         C          93
2                    数学         A          88
1                    语文         B          99
2                    语文         A          96
 */
二月十六 版主 2018-11-27
  • 打赏
  • 举报
回复
SELECT 课程,人员,分数 FROM (
SELECT *,ROW_NUMBER()OVER(PARTITION BY 课程 ORDER BY 分数 DESC) rn FROM #Score)t
WHERE rn<=2 ORDER BY 课程 DESC


34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧