MS SQL Server partition by 函数实战 统计与输出

目录

需求

范例运行环境

表及视图样本设计

数据统计实现

小结


需求

假设有一课程项目,我们需要统计该项目中的课件数量,并提取课程信息,如课程标题名称、排序号等,如果使用 GROUP BY 聚合函数,则只能统计返回课件项目及对应的课件数量一条记录,无法显示明细信息,对于终端想要进行输出的话,此时 partition by 就派上用场了。

输出如下图:

在管理心理学项目里包括若干课程,我们将根据排序号进行分类输出,显示课程的明细内容并继续其它业务操作。

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

表及视图样本设计

主表 ms_project_ep 项目课程明细表设计如下:

| 序号 | 字段名 | 类型 | 说明 | 备注 |
| 1 | cid | uniqueidentifier | 唯一标识 | |
| 2 | project_cid | uniqueidentifier | 所属项目ID | 对应项目表 |
| 3 | lession_cid | tinyint | 所属课程ID | 对应课程表 |

4 sortid int 排序号 总排序号

查询分析器结果数据显示如下图:

sql 复制代码
select cid,project_cid,lession_cid,sortid 
from ms_project_ep 
order by project_cid,sortid

如图我们对项目ID、总排序号进行排序。

数据统计实现

假设统计视图可查询课程项目ID、课程ID、排序号和课程数, 统计表设计如下:

| 序号 | 字段名 | 类型 | 说明 | 备注 |
| 1 | project_cid | uniqueidentifier | 项目ID | |
| 2 | lession_cid | uniqueidentifier | 课程ID | |
| 3 | lcount | int | 课程总数 | 通过项目ID进行分区 |

4 sortid int 排序号 每分区排序号从1开始

查询分析器结果数据显示如下图:

如图我们看到查询结果按项目ID进行分区,并统计课程数,

如项目ID:7CF46B88-0B4D-49A0-A0D8-08B9AF064AC5,包含了1个课程;

项目ID:EE8AFC3F-5E82-46FA-B81E-10F7F06F61C8,包含了122个课程;

并且每一个分区提取排序号,从1开始。

SQL 语句如下:

sql 复制代码
select project_cid,lession_cid,
count(lession_cid) over (partition by project_cid order by project_cid) as lcount,
sortid 
from ms_project_ep 
order by project_cid,sortid

关键说明见下表:

| 序号 | 关键语句 | 说明 |

1 count(lession_cid) over (partition by project_cid order by project_cid) as lcount partition by project_cid order by project_cid,按项目ID分区并排序; 使用count函数统计课程数;

小结

partition by 的聚合统计和使用还有很多种,如下表:

| 序号 | 统计项 | 说明 |
| 1 | row_number() | 记录总排序号 |
| 2 | rank() | 排序,有并列则按总数递增,如两个第1后是第3 |
| 3 | dense_rank() | 排序,有并列则按上一数值递增,如两个第1后是第2 |
| 4 | count(字段名) | 求个数 |
| 5 | max(字段名) | 求最大值 |
| 6 | min(这段名) | 求最小值 |
| 7 | sum(字段名) | 求和 |
| 8 | avg(字段名) | 求平均值 |
| 9 | first_value(字段名) | 求第一个值 |
| 10 | last_value(字段名) | 求最后一个值 |
| 11 | lag(字段名,行数) | 取指定列,将分区列的数据后错n行,行数不是必选项,默认为0,即不错行 |

12 lead(字段名,行数) 取指定列,将分区列的数据前错n行,行数不是必选项,默认为0,即不错行

更多学习还请参阅:
https://learn.microsoft.com/zh-cn/sql/t-sql/functions/avg-transact-sql?view=sql-server-ver16&redirectedfrom=MSDN

至此 partition by 的使用我们就介绍到这里,具体使用中我们还需要灵活掌握。对结果数据的前端输出这里不再详述,需要根据数据的结构以满足我们的设计输出。

感谢您的阅读,希望本文能够对您有所帮助。

相关推荐
tomcoding9 小时前
遇到一个ORA-01017错误,解决方法
数据库·oracle
ejinxian10 小时前
PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等数据库
数据库·mysql·mongodb
折哥的程序人生 · 物流技术专研16 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
AOwhisky16 小时前
Redis 学习笔记(第三期):持久化与主从复制
运维·数据库·redis·笔记·学习·云计算
李白的天不白16 小时前
数据库连接报错问题
数据库
一条泥憨鱼16 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
爱喝水的鱼丶17 小时前
SAP-ABAP:SAP视图开发入门:四类标准视图的适用场景与创建步骤详解
服务器·数据库·性能优化·sap·abap
大白要努力!17 小时前
MySQL 8.0 + Navicat 完整操作指南
数据库·mysql
云絮.18 小时前
数据库操作
数据库·mysql·算法·oracle
小小工匠18 小时前
Redis 缓存替换策略:8 种淘汰策略与 LRU 实现剖析
数据库·redis·缓存