HiveSql中的函数家族(二)

一、窗口函数

1、什么是窗口函数

在 SQL 中,窗口函数(Window Functions)是一种特殊的函数,它允许在查询结果集的特定窗口(通常是一组行)上执行聚合、分析和计算操作,而无需聚合整个结果集。窗口函数可以用来解决许多复杂的数据分析问题,例如计算排名、累积总数、移动平均值等。窗口函数通常与 OVER 子句一起使用,该子句用于定义窗口的大小和位置。

窗口函数的一般语法结构如下:

sql 复制代码
<窗口函数>([参数]) OVER (
    [PARTITION BY 列1, 列2, ...]
    [ORDER BY 列3 [ASC|DESC]]
    [ROWS | RANGE 关键字]
    [窗口范围或行数定义]
)
  • <窗口函数> 是要执行的窗口函数,例如 SUM、AVG、ROW_NUMBER 等。
  • PARTITION BY 子句可选,用于对结果集进行分区,将数据划分为不同的分组。
  • ORDER BY 子句可选,用于对每个分区内的行进行排序。
  • ROWSRANGE 关键字指定窗口的类型,ROWS 表示窗口以行数为单位,RANGE 表示窗口以值范围为单位。
  • 窗口范围或行数定义用于指定窗口的大小和位置,例如 ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING 表示窗口包括当前行及其前面的三行和后面的一行。

2、常用的窗口函数

  1. ROW_NUMBER():为结果集中的每一行分配一个唯一的数字序号。

    语法格式:

    sql 复制代码
    ROW_NUMBER() OVER (ORDER BY 列1 [ASC|DESC])
  2. RANK():为结果集中的每一行分配一个排名,如果有相同的值,则会跳过相同的排名。

    语法格式:

    sql 复制代码
    RANK() OVER (ORDER BY 列1 [ASC|DESC])
  3. DENSE_RANK():为结果集中的每一行分配一个密集排名,如果有相同的值,则仍然连续分配排名。

    语法格式:

    sql 复制代码
    DENSE_RANK() OVER (ORDER BY 列1 [ASC|DESC])
  4. SUM():计算指定列的总和,可以在窗口内计算。

    语法格式:

    sql 复制代码
    SUM(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
  5. AVG():计算指定列的平均值,可以在窗口内计算。

    语法格式:

    sql 复制代码
    AVG(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
  6. LEAD():获取结果集中当前行后面的指定行数的值。

    语法格式:

    sql 复制代码
    LEAD(列1, offset, default_value) OVER (ORDER BY 列2 [ASC|DESC])
  7. LAG():获取结果集中当前行前面的指定行数的值。

    语法格式:

    sql 复制代码
    LAG(列1, offset, default_value) OVER (ORDER BY 列2 [ASC|DESC])
  8. FIRST_VALUE():获取结果集中指定列的第一个值。

    语法格式:

    sql 复制代码
    FIRST_VALUE(列1) OVER (ORDER BY 列2 [ASC|DESC])
  9. LAST_VALUE():获取结果集中指定列的最后一个值。

    语法格式:

    sql 复制代码
    LAST_VALUE(列1) OVER (ORDER BY 列2 [ASC|DESC] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
  10. COUNT():计算指定列的行数,可以在窗口内计算。

    语法格式:

    sql 复制代码
    COUNT(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
  11. MAX():获取指定列的最大值,可以在窗口内计算。

    语法格式:

    sql 复制代码
    MAX(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
  12. MIN():获取指定列的最小值,可以在窗口内计算。

    语法格式:

    sql 复制代码
    Min(列1) OVER (PARTITION BY 列2 ORDER BY 列3 [ASC|DESC])
  13. NTILE():将结果集分成指定数量的桶,并为每个桶分配一个编号。

    语法格式:

    sql 复制代码
    NTILE(number_of_buckets) OVER (ORDER BY 列1 [ASC|DESC])
  14. PERCENT_RANK():计算结果集中每行的百分比排名。

    语法格式:

    sql 复制代码
    PERCENT_RANK() OVER (ORDER BY 列1 [ASC|DESC])
  15. CUME_DIST():计算结果集中每行的累积分布值。

    语法格式:

    sql 复制代码
    CUME_DIST() OVER (ORDER BY 列1 [ASC|DESC])
  16. ROW_NUMBER():为结果集中的每一行分配一个唯一的数字序号。

语法格式:

sql 复制代码
ROW_NUMBER() OVER (ORDER BY 列1 [ASC|DESC])

二、CTE语法

CTE语法类似子查询,可以将一个select语句计算的结果当成一个新的临时表使用。

sql 复制代码
-- 子查询,将子查询的结果当做表使用
select empno,ename from (
select * from emp) t1;
sql 复制代码
-- 基本用法
with 临时表名 as(查询语句)
select * from 临时表名

-- 多个计算结果保存
with tb1 as(查询语句),,
	tb2 as(查询语句 select * from tb1),
	tb3 as(查询语句)
	.....
select * from tb3 join tb2
sql 复制代码
with tb1 as(select * from emp)
select ename,sal from tb1;
相关推荐
m0_598177232 分钟前
SQL 方法函数(1)
数据库
oMcLin3 分钟前
如何在Oracle Linux 8.4上通过配置Oracle RAC集群,确保企业级数据库的高可用性与负载均衡?
linux·数据库·oracle
信创天地3 分钟前
核心系统去 “O” 攻坚:信创数据库迁移的双轨运行与数据一致性保障方案
java·大数据·数据库·金融·架构·政务
胖咕噜的稞达鸭6 分钟前
进程间的通信(1)(理解管道特性,匿名命名管道,进程池,systeam V共享内存是什么及优势)重点理解代码!
linux·运维·服务器·数据库
德彪稳坐倒骑驴10 分钟前
Sqoop入门常用命令
数据库·hadoop·sqoop
资深web全栈开发11 分钟前
pg on delete 策略探讨
数据库·pg
玖日大大11 分钟前
Milvus 深度解析:开源向量数据库的技术架构、实践指南与生态生态
数据库·开源·milvus
zhyf11913 分钟前
Max395(ubuntu24.04)AMD显卡GLM-4.7-UD-IQ1-M量化模型部署手册
大数据·elasticsearch·搜索引擎
雪域迷影14 分钟前
Node.js中使用node-redis库连接redis服务端并存储数据
数据库·redis·node.js
小北方城市网20 分钟前
微服务接口设计实战指南:高可用、易维护的接口设计原则与规范
java·大数据·运维·python·微服务·fastapi·数据库架构