神了,程序员放弃写代码,直接用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


目录
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
创建SQL数据库的基本步骤与代码指南
在信息时代,数据管理显得尤为重要,其中数据库系统已成为信息技术架构的关键部分。而当我们谈论数据库系统时,SQL(结构化查询语言)无疑是其中最核心的工具之一。本文将详细介绍如何使用SQL创建数据库,包括编写相应的代码和必要的步骤。由于篇幅限制,本文可能无法达到您要求的2000字长度,但会尽量涵盖创建数
123 3
|
3月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
3月前
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
5月前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
48 1
|
5月前
|
SQL 流计算
Flink SQL 在快手实践问题之CUMULATE窗口的划分逻辑如何解决
Flink SQL 在快手实践问题之CUMULATE窗口的划分逻辑如何解决
113 2
|
4月前
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
118 0
|
4月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
182 0
|
5月前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
142 0
|
5月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
71 0
|
5月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available