sqlserver分页及分析函数sum over rank over count over

目录

基础数据

排序及分析函数

 ROW_NUMBER按照年龄简单排序,并显示序号

 ROW_NUMBER按照班级分组,并按照年龄,性别排序显示出对应的序号

 ROW_NUMBER分页每页5条

 offset分页每页5条

 分页时同时查询出总数量count over

 分页时查询出总数量,并查出每班人数count over

 分页时查询出总数量,并查出每班年龄和sum over

 分页时查询出总数量,并查出每班年龄平均值avg over

 所有学生按照年龄排序,年龄相同排名一样,下个阶段排名累计 rank over

 所有学生按照年龄排序,年龄相同排名一样,下个阶段排名不累计 dense_rank over


  • 基础数据

USE [TestDb]
GO
/****** Object:  Table [dbo].[Student]    Script Date: 2022/8/30 10:55:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Sex] [int] NULL,
	[Age] [int] NULL,
	[ClassNumber] [nvarchar](50) NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Student] ON 

INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (1, N'小明', 1, 3, N'小一班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (2, N'小红', 0, 4, N'中一班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (3, N'小丽', 0, 4, N'中一班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (4, N'小雅', 0, 5, N'大一班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (5, N'小阳', 1, 3, N'小一班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (6, N'小新', 1, 4, N'小二班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (7, N'小肥', 1, 5, N'小三班')
INSERT [dbo].[Student] ([Id], [Name], [Sex], [Age], [ClassNumber]) VALUES (8, N'小鹏', 1, 3, N'小一班')
SET IDENTITY_INSERT [dbo].[Student] OFF
GO

数据整体效果为

  •   排序及分析函数

  •  ROW_NUMBER按照年龄简单排序,并显示序号

select    ROW_NUMBER() over(order by Age ) as Number,Age,Name,Sex,ClassNumber from Student

   

  •  ROW_NUMBER按照班级分组,并按照年龄,性别排序显示出对应的序号

select * 
from (select	
	  ROW_NUMBER() over(partition by ClassNumber order by Age,Sex) as Number,Age,Name,Sex,ClassNumber 
	  from Student) t

         

  •  ROW_NUMBER分页每页5条

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select * from (select  ROW_NUMBER() over(order by Age ) as Number,Age,Name,Sex,ClassNumber  from Student) t 
where Number between (@Pageindex - 1) * @PageSize + 1 and @Pageindex * @PageSize

  • offset分页每页5条

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select Age,Name,Sex,ClassNumber from Student
order by Age
offset (@pageindex-1)*@pagesize row
fetch next @pagesize row only

 

  • 分页时同时查询出总数量count over

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select Age,Name,Sex,ClassNumber,COUNT(1) over() as Total from Student
order by Age
offset (@pageindex-1)*@pagesize row
fetch next @pagesize row only

 

  •  分页时查询出总数量,并查出每班人数count over

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select Age,Name,Sex,ClassNumber,(COUNT(1) over()) as Total,(COUNT(1) over(partition by ClassNumber)) as ClassTotal from Student
order by Age
offset (@pageindex-1)*@pagesize row
fetch next @pagesize row only

  •  分页时查询出总数量,并查出每班年龄和sum over

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select Age,Name,Sex,ClassNumber,(COUNT(1) over()) as Total,(sum(Age) over(partition by ClassNumber)) as ClassSum from Student
order by Age
offset (@pageindex-1)*@pagesize row
fetch next @pagesize row only

  •   分页时查询出总数量,并查出每班年龄平均值avg over

declare @pagesize int
set @pagesize=5
declare @pageindex int
set @pageindex = 1
select Age,Name,Sex,ClassNumber,(COUNT(1) over()) as Total,(avg(Age) over(partition by ClassNumber)) as ClassAvg from Student
order by Age
offset (@pageindex-1)*@pagesize row
fetch next @pagesize row only

  •  所有学生按照年龄排序,年龄相同排名一样,下个阶段排名累计 rank over

 select RANK() over(order by Age) as AgeIndex,Age,Name,Sex,ClassNumber from Student

  •  所有学生按照年龄排序,年龄相同排名一样,下个阶段排名不累计 dense_rank over

select dense_rank() over(order by Age) as AgeIndex,Age,Name,Sex,ClassNumber from Student

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是关于SQL Server中over函数的介绍和示例: over函数SQL Server中的一个窗口函数,它可以用来对查询结果进行分组、排序和排名等操作。over函数的语法如下: ``` <over_clause> ::= OVER ( [ PARTITION BY value_expression , ... [ n ] ] [ ORDER BY clause ] [ ROWS { UNBOUNDED PRECEDING | n PRECEDING } | RANGE { UNBOUNDED PRECEDING | n PRECEDING } | CURRENT ROW | RANGE BETWEEN frame_start AND frame_end ] ) ``` 其中,PARTITION BY子句用于指定分组的列,ORDER BY子句用于指定排序的列,ROWS或RANGE子句用于指定窗口的大小和位置。 以下是一个示例,假设有一个名为t2的表,包含学生的姓名、班级和成绩信息,我们可以使用over函数来查询每个班级中成绩最高的学生: ``` SELECT name, class, s, rank() over(partition by class order by s desc) mm FROM t2 WHERE mm = 1; ``` 在上面的查询语句中,我们使用了rank()函数来计算每个学生在班级中的排名,然后使用over函数来对每个班级的学生进行分组和排序,最后筛选出排名为1的学生,即每个班级中成绩最高的学生。 另外,over函数还可以与其他窗口函数一起使用,例如ROW_NUMBER()函数,用于对查询结果进行编号: ``` SELECT ROW_NUMBER() over(order by RequiredDate) num, * FROM [Northwind].[dbo].[Orders]; ``` 在上面的查询语句中,我们使用ROW_NUMBER()函数来为查询结果中的每一行分配一个唯一的编号,然后使用over函数来指定编号的排序方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大黑眼圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值