神了,程序员放弃写代码,直接用SQL写逻辑,你废吗?

简介: 神了,程序员放弃写代码,直接用SQL写逻辑,你废吗?

🍁 一、分析函数语法



function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>);


🍃 1.1 参数详解


function_name():函数名称

argument:参数

over( ):开窗函数

partition_Clause:分区子句,数据记录集分组,group by…

order by_Clause:排序子句,数据记录集排序,order by…

windowing_Clause:开窗子句,定义分析函数在操作行的集合,三种开窗方式:rows、range、Specifying

注:使用开窗子句时一定要有排序子句!!!


🍃 1.2 常用分析函数


row_number() over(partition by … order by …)

rank() over(partition by … order by …)

dense_rank() over(partition by … order by …)

count() over(partition by … order by …)

max() over(partition by … order by …)

min() over(partition by … order by …)

sum() over(partition by … order by …)

avg() over(partition by … order by …)

first_value() over(partition by … order by …)

last_value() over(partition by … order by …)

lag() over(partition by … order by …)

lead() over(partition by … order by …)


🍁 二、汇总



1、count() over() :统计分区中各组的行数,partition by 可选,order by 可选

2、sum() over() :统计分区中记录的总和,partition by 可选,order by 可选

3、avg() over() :统计分区中记录的平均值,partition by 可选,order by 可选

4、min() over() :统计分区中记录的最小值,partition by 可选,order by 可选

5、 max() over() :统计分区中记录的最大值,partition by 可选,order by 可选


🍃 2.1 总计数


–总计数,统计所有行的总数

select ename,deptno,count(*) over() from emp;


image.png


🍃 2.2 递加累计求和


–,先排序,再递加累计求和

select ename,deptno,sal,hiredate,sum(sal) over(order by hiredate) from emp;


image.png

🍃 2.3 分组求平均值


–先分组,再对组内求平均值

select ename,deptno,job,sal,avg(sal) over(partition by job) from emp;


image.png


🍃 2.4 分组递加求最大


–先分组排序,再对组内求最大值

select ename,deptno,job,hiredate,sal,

max(sal)over(partition by job order by hiredate ) from emp;

image.png


🍁 三、排序



🍃 3.1 无重复值排序


row_number() over() :排序,无重复值,partition by 可选,order by 必选

select row_number() over(order by a.sal desc) rak,a.* from emp a;

当SAL相同时,按顺序排序




–先分组,再对组内排序,无重复值

select row_number() over(partition by deptno order by a.sal desc) rak,a.* from emp a;

9562f9d884cd4ba4b8ba37ed51a32df8.png


🍃 3.2 排序连续


dense_rank() :连续排序,partition by 可选,order by 必选

–当值相同时,排序是连续的

select dense_rank() over(partition by deptno order by a.sal desc) rak,a.* from emp a;

21d9deac1fd94e8c8791be78ba9d843a.png


🍃 3.3 排序跳跃


rank() over() :跳跃排序,partition by 可选,order by 必选

当值相同时,排序是跳跃的

select rank() over(partition by deptno order by a.sal desc) rak,a.* from emp a;、


8118d65411754512ac57b9106a19c9f1.png

🍁 四、KEEP函数



max(#) keep(dense_rank first order by # desc)

min(#) keep(dense_rank last order by # desc)

从DENSE_RANK返回的集合中取出排在最后面或者最前面的一个值的行

可能多行,因为值可能相等,因此完整的语法需要在开始处加上一个集合函数以从中取出记录


select job, max(sal) keep(dense_rank first order by sal desc), max(sal) keep(dense_rank last order by sal desc) from emp group by job;

bfa3826d4d944aa9a76ea75dc266f36c.png

119056121b8e4e12946a462328fcb3a6.png

🍁 五、开窗函数



指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化
50 preceding:前50行
150 following:后150行
UNBOUNDED :不受控的,无限的
current row 当前行
// 从当前行到最后的数据
between current row and unbounded following
//前面所有行与当前行的累加
rows between unbounded preceding and current row
//前一行的值+当前行的值+后一行的值
rows between 1 preceding and 1 following
//开始到结束的所有数据
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING


🍃 5.1 ROW窗口


rows是物理窗口,在一组内基于任意变化或固定的窗口中,可以用该子句来让分析函数计算它的值

这将在一组内创建一个变化的窗口,请注意,要使用窗口,必须使用ORDER BY 子句


select deptno,ename,sal,deptno,
sum(sal) over(
         partition by deptno
         order by ename
         rows 2 preceding
)sliding_total
from emp

c2e066463f6344e29d69f642b9834413.png


🍃 5.2 Range窗口


range是逻辑窗口,是对范围进行统计

是指定当前行对应值的范围取值,列数不固定,只要行值在范围内,对应列都包含在内

有数字,记住precding,就是减,following是加, 统计在这个范围内的数据


rows表示行,就是前n行,后n行

而range表示的是具体的值,比这个值小n的行,比这个值大n的行

range between是以当前值为锚点进行计算


range between 4 preceding AND 7 following

表示:如果当前值为10的话就取前后的值在6到17之间的数据。

sum(close) range between 100 preceding and 200 following

表示:通过字段差值来进行选择。如当前行的 close 字段值是 200,

那么这个窗口大小的定义就会选择分区中 close 字段值落在 100 至 400 区间的记录(行)。

select ename,hiredate,sal,deptno,
sum(sal) over(partition by deptno order by sal asc range 100 preceding) sum_sal
from emp;

10ae19fd42974d9880169f9281464027.png


目录
相关文章
|
11月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
292 4
|
4月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
245 0
|
10月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1393 0
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
4176 11
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
477 3
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
558 0
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
722 0
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
423 0