【SQL应知应会】分析函数的点点滴滴(二)

简介: 【SQL应知应会】分析函数的点点滴滴(三)

1.什么是分析函数:

👉:传送门💖分析函数💖


1.1统计分析函数略解

👉:传送门💖统计分析函数💖


1.2.排序分析函数

👉:传送门💖排序分析函数💖


1.3 开窗函数 ROW 与 RANGE

row 物理行 与行中的值是没有关系的


range 逻辑行 与行中的值是有关系的


select e.*,

   first_value(empno) over (partition by deptno order by sal) rn

from emp e;

select e.*,

   first_value(empno) over (partition by deptno order by sal

      range between unbounded preceding and current row -- 忽略的Windows子句,与上面没有加Windows子句的sql命令的作用是一样的

) rn

from emp e;

1

2

3

4

5

6

7

8

9

range between unbounded preceding and current row指定了要统计的窗口范围,这个窗口范围也是面向行的,只是比partiton更细,先partiton分组,再按组里面看窗口范围

1.3.1range的窗口范围是负无穷 ~ 当前值(range逻辑行,当前行与行中的值有关,所以到当前值),负无穷是每个组的最上面,正无穷在每个组的下面

所以用first_value的时候,不加range between unbounded preceding and current row这个子句是没有问题的,因为总能统计到第一行

微信图片_20230701101608.png

1.3.2rows看的是物理行,与行中的值是没有关系的

select e.*,

   first_value(empno) over (partition by deptno order by sal

      rows between unbounded preceding and current row

) rn

from emp e;

1

2

3

4

5

微信图片_20230701101659.png


1.3.3 将first_value换成 last_value,观察 range和 rows

select e.*,

   last_value(empno) over (partition by deptno order by sal

      range between unbounded preceding and current row) rn

from emp e;

1

2

3

4


微信图片_20230701101711.png

微信图片_20230701101723.png

select e.*,

   last_value(empno) over (partition by deptno order by sal

      rows between unbounded preceding and current row) rn

from emp e;

1

2

3

4



1.3.4 自定义rows between ... preceding and ...

select e.*,

   last_value(empno) over (partition deptno order by sal

      rows between 1 preceding and 1 following) rn

from emp e;

1

2

3

4

1 preceding代表的是当前行的前一行, 1 FOLLOWING 则代表的是当前行的后一行

微信图片_20230701101735.png

如果写成unbounded following

UNBOUNDED FOLLOWING 表示在窗口函数中不限制窗口范围的结束位置,也就是说窗口的结束位置一直延伸至最后一行

微信图片_20230701101749.png

1.3.5 自定义range between ... preceding and ...

因为range是逻辑行,与值有关,所以在...中填写的内容应该根据表格中的值来决定

select e.*,

   last_value(empno) over (partition by deptno order by sal

      range between 400 preceding and 400 following) rn

from emp e;

1

2

3

4

微信图片_20230701101759.png

1.4 统计分析函数详解

1.4.1 分析函数使用sum()进行累计

select t.*,sum(sal) over(partition by deptno order by sal) cum_sum from emp t; -- 分析函数可以写group by,但是不需要

1

在order by后面默认忽略了一个子句range between unbounded preceding and current row ,即默认忽略了一个逻辑行的(-∞~当前值)的子句


但是从下图中可以看出,当有两行的值一样的时候,其实并没有达到我们想要的累计效果

微信图片_20230701101812.png

使用rows进行改进,以达到想要的累计效果


select t.*,

      sum(sal) over(partition by deptno order by sal

      rows between unbounded preceding and current row

      ) cum_sum

from emp t;

1

2

3

4

5

微信图片_20230701101834.png

Oracle:

select t.*,

   sum(sal) over(partition by deptno order by sal

      rows between unbounded preceding and current row

      ) cum_sum

from emp t;

1

2

3

4

5

微信图片_20230701101845.png

select t.*,

   sum(sal) over(partition by deptno order by sal,rowid) cum_sum -- 使用rowid,相当于实现了一个物理行的统计

from emp t;

# oracle 也可以使用rowid,因为rowid是指向内存的唯一的地址,是决定数据库如果找到记录的,这个行号是唯一的  

1

2

3

4

微信图片_20230701101858.png

1.4.2 使用count()进行累计

select t.*,

   count(sal) over(partition by deptno order by sal,rowid) cum_sum

from emp t;

# 效果与row_number() over()有点像

1

2

3

4

微信图片_20230701101910.png

1.4.3 使用max()进行求最大值

select t.*,

   max(sal) over(partition by deptno order by sal) cum_sum -- 求得是最大值,所以就不能用物理行了

from emp t;

1

2

3

微信图片_20230701101926.png


1.5 不使用order by时

# 按照部门编号进行分区,然后使用sum()得到每个组的薪水和

select t.*,

   sum(sal) over(partition by deptno) cum_sum

from emp t;

1

2

3

4

微信图片_20230701101946.png


# 统计每组有薪水的人数,因为count()动态忽略null

select t.*,

   count(sal) over(partition by deptno) cum_sum

from emp t;

微信图片_20230701102019.png



# 求出了所有人的薪水和

# 分析函数不会减少行数,数据有几行,求完和的结果就有几行

select t.*,

   sum(sal) over cum_sum

from emp t;

微信图片_20230701102033.png


求占比

select sal,sal/sum(sal) over() cum_sum,sal/(select sum(sal) from emp) from emp;

1

微信图片_20230701102043.png

相关文章
|
4月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
382 3
|
5月前
|
SQL 人工智能 数据挖掘
如何在`score`表中正确使用`COUNT`和`AVG`函数?SQL聚合函数COUNT与AVG使用指南
本文三桥君通过score表实例解析SQL聚合函数COUNT和AVG的常见用法。详解COUNT(studentNo)、COUNT(score)、COUNT()的区别,以及AVG函数对数值/字符型字段的不同处理,特别指出AVG()是无效语法。实战部分提供6个典型查询案例及结果,包含创建表、插入数据的完整SQL代码。产品专家三桥君强调正确理解函数特性(如空值处理、字段类型限制)对数据分析的重要性,帮助开发者避免常见误区,提升查询效率。
362 0
|
8月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
8月前
|
SQL 算法 数据挖掘
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
【SQL破案系列】第一篇: 如果监控摄像头拍下了很多车辆的行车轨迹,那么如何利用这些行车轨迹来分析车辆运行的特征,是不是能够分析出犯罪分子“踩点”的位置
256 15
|
9月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
333 12
|
SQL 数据库 开发者
ClkLog埋点分析系统支持自定义SQL 查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
ClkLog埋点分析系统支持自定义SQL 查询
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
257 3
|
SQL 存储 数据可视化
手机短信SQL分析技巧与方法
在手机短信应用中,SQL分析扮演着至关重要的角色
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
2533 5