• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

请教一个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语句应该怎么写?非常感谢!
...全文
13 点赞 收藏 2
写回复
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


回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告