Over 的使用

测试数据如下

ID,成绩,科目(1英语,2数学,3语文),科目名称,学生名称,添加时间

问题:如果想查询每个学科的前5名学生怎么写sql?

--按照学科,成绩倒序查前5条,查三次

select top 5 * from [dbo].[Achievement] where [subject]='1' order by Fraction desc

select top 5 * from [dbo].[Achievement] where [subject]='2' order by Fraction desc

select top 5 * from [dbo].[Achievement] where [subject]='3' order by Fraction desc

--使用Over取每个学科成绩的前5名

--关键字row_number() over(partition by 分区字段 order by 排序字段 desc)

select * from

(

select [name],[subject],subjectName,Fraction,

--按照学科分区,成绩倒序加一列编号

row_number() over(partition by [subject] order by Fraction desc) mm

from [dbo].[Achievement]

) a

where mm<6

 

--取所有成绩的前5名,不过滤重复数据

select * from

(

select [name],[subject],subjectName,Fraction,

--成绩倒序加一列编号

row_number() over( order by Fraction desc) mm

from [dbo].[Achievement]

) a

where mm<6--取前5名

 

--成绩逐行累计

select * from

(

select [name],[subject],subjectName,Fraction,

--成绩倒序,成绩累计

SUM(Fraction) over( order by Fraction desc) mm

from [dbo].[Achievement]

) a

 

 

--表结构

CREATE TABLE [dbo].[Achievement](

[Id] [int] IDENTITY(1,1) NOT NULL, --ID

[Fraction] [decimal](18, 0) NULL, --成绩

[Subject] [nvarchar](100) NULL, --科目(1英语,2数学,3语文)

[SubjectName] [nvarchar](100) NULL, --科目名称

[Name] [nvarchar](100) NULL, --学生名称

[AddTime] [datetime] NULL, --添加时间

CONSTRAINT [PK_Achievement] PRIMARY KEY CLUSTERED

(

[Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

 

--数据,3门学科,11位学生,每位学生3课成绩,共33条数据

begin

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (1, CAST(45 AS Decimal(18, 0)), N'1', N'英语', N'小红', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (2, CAST(67 AS Decimal(18, 0)), N'1', N'英语', N'小蓝', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (3, CAST(23 AS Decimal(18, 0)), N'1', N'英语', N'小白', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (4, CAST(89 AS Decimal(18, 0)), N'1', N'英语', N'小字', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (5, CAST(67 AS Decimal(18, 0)), N'1', N'英语', N'小嗯嗯', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (6, CAST(23 AS Decimal(18, 0)), N'1', N'英语', N'小规范', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (7, CAST(32 AS Decimal(18, 0)), N'1', N'英语', N'小而二哥', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (8, CAST(56 AS Decimal(18, 0)), N'1', N'英语', N'小啥第三方', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (9, CAST(88 AS Decimal(18, 0)), N'1', N'英语', N'小为', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (10, CAST(78 AS Decimal(18, 0)), N'1', N'英语', N'小男女', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (11, CAST(80 AS Decimal(18, 0)), N'1', N'英语', N'小爽肤水', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (12, CAST(42 AS Decimal(18, 0)), N'2', N'数学', N'小红', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (13, CAST(6 AS Decimal(18, 0)), N'2', N'数学', N'小蓝', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (14, CAST(98 AS Decimal(18, 0)), N'2', N'数学', N'小白', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (15, CAST(56 AS Decimal(18, 0)), N'2', N'数学', N'小字', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (16, CAST(34 AS Decimal(18, 0)), N'2', N'数学', N'小嗯嗯', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (17, CAST(23 AS Decimal(18, 0)), N'2', N'数学', N'小规范', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (18, CAST(67 AS Decimal(18, 0)), N'2', N'数学', N'小而二哥', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (19, CAST(12 AS Decimal(18, 0)), N'2', N'数学', N'小啥第三方', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (20, CAST(33 AS Decimal(18, 0)), N'2', N'数学', N'小为', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (21, CAST(90 AS Decimal(18, 0)), N'2', N'数学', N'小男女', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (22, CAST(95 AS Decimal(18, 0)), N'2', N'数学', N'小爽肤水', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (23, CAST(78 AS Decimal(18, 0)), N'3', N'语文', N'小红', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (24, CAST(55 AS Decimal(18, 0)), N'3', N'语文', N'小蓝', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (25, CAST(45 AS Decimal(18, 0)), N'3', N'语文', N'小白', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (26, CAST(23 AS Decimal(18, 0)), N'3', N'语文', N'小字', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (27, CAST(90 AS Decimal(18, 0)), N'3', N'语文', N'小嗯嗯', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (28, CAST(23 AS Decimal(18, 0)), N'3', N'语文', N'小规范', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (29, CAST(45 AS Decimal(18, 0)), N'3', N'语文', N'小而二哥', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (30, CAST(47 AS Decimal(18, 0)), N'3', N'语文', N'小啥第三方', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (31, CAST(12 AS Decimal(18, 0)), N'3', N'语文', N'小为', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (32, CAST(84 AS Decimal(18, 0)), N'3', N'语文', N'小男女', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

INSERT [dbo].[Achievement] ([Id], [Fraction], [Subject], [SubjectName], [Name], [AddTime]) VALUES (33, CAST(97 AS Decimal(18, 0)), N'3', N'语文', N'小爽肤水', CAST(N'2011-01-02T00:00:00.000' AS DateTime))

end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值