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


     

    目录

    需求

    范例运行环境

    表及视图样本设计

    数据统计实现

    小结


    需求

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

    输出如下图:

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

    范例运行环境

    操作系统: Windows Server 2019 DataCenter

    数据库:Microsoft SQL Server 2016

    表及视图样本设计

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

    序号字段名类型说明备注
    1ciduniqueidentifier唯一标识
    2project_ciduniqueidentifier所属项目ID对应项目表
    3lession_cidtinyint所属课程ID对应课程表
    4sortidint排序号总排序号

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

    1. select cid,project_cid,lession_cid,sortid
    2. from ms_project_ep
    3. order by project_cid,sortid

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

    数据统计实现

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

    序号字段名类型说明备注
    1project_ciduniqueidentifier项目ID
    2lession_ciduniqueidentifier课程ID
    3lcountint课程总数通过项目ID进行分区
    4sortidint排序号每分区排序号从1开始

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

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

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

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

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

    SQL 语句如下:

    1. select project_cid,lession_cid,
    2. count(lession_cid) over (partition by project_cid order by project_cid) as lcount,
    3. sortid
    4. from ms_project_ep
    5. 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 的聚合统计和使用还有很多种,如下表:

    序号统计项说明
    1row_number()记录总排序号
    2rank()排序,有并列则按总数递增,如两个第1后是第3
    3dense_rank()排序,有并列则按上一数值递增,如两个第1后是第2
    4count(字段名)求个数
    5max(字段名)求最大值
    6min(这段名)求最小值
    7sum(字段名)求和
    8avg(字段名)求平均值
    9first_value(字段名)求第一个值
    10last_value(字段名)求最后一个值
    11lag(字段名,[行数])

    取指定列,将分区列的数据后错n行,行数不是必选项,默认为0,即不错行

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

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

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

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

  • 相关阅读:
    java项目-第145期ssm汽车在线销售系统-java毕业设计_计算机毕业设计
    让大脑自由
    7-7 六度空间
    深入理解并发和并行
    OpenCV 01(图像加载与显示)
    【HBZ分享】Mysql的InnoDB原理
    c#对接webservice接口
    (附源码)node.js物资管理系统 毕业设计 071130
    计算机中找不到d3dcompiler47.dll怎么解决,实用解决方法推荐
    【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷3
  • 原文地址:https://blog.csdn.net/michaelline/article/details/137818609