当前位置: 首页 > news >正文

Hive数仓操作(十五)

Hive 开窗函数

Hive窗口函数是一种特殊的函数,允许用户在查询中对一组行进行计算,而不仅仅是单独的行。窗口函数可以在 SQL 查询中进行聚合、排名、累积计算等。这使得窗口函数在数据分析和报告生成中非常有用。

窗口函数的基本组成部分

  1. 函数类型:如 ROW_NUMBER(), RANK(), DENSE_RANK(), SUM(), AVG() 等。
  2. OVER 子句:定义窗口的范围和分区,用于指定在哪些行上应用窗口函数。

窗口边界标识符

  1. CURRENT ROW:

    • 表示窗口的当前行。通常用于窗口的结束范围。
  2. n PRECEDING:

    • 表示当前行之前的n行。例如,ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 表示从当前行向上看一行到当前行。
  3. n FOLLOWING:

    • 表示当前行之后的n行。例如,ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING 表示从当前行到当前行的后两行。
  4. UNBOUNDED:

    • 表示没有边界,通常用于定义窗口的起点或终点。
  5. UNBOUNDED PRECEDING:

    • 表示从窗口的起点开始,不限行数。
  6. UNBOUNDED FOLLOWING:

    • 表示到窗口的终点结束,不限行数。

窗口边界函数

  1. LAG(col, n):

    • 这个函数用于获取当前行的前n行中的指定列的值。它可以用于比较当前行与前几行的数据。
    SELECT employee_id, salary, LAG(salary, 1) OVER (ORDER BY employee_id) AS previous_salary
    FROM employees;
    

    这个示例显示了每个员工的当前工资和前一个员工的工资。

  2. LEAD(col, n):

    • 这个函数用于获取当前行的后n行中的指定列的值。与 LAG 类似,但它是向下查找。
    SELECT employee_id, salary, LEAD(salary, 1) OVER (ORDER BY employee_id) AS next_salary
    FROM employees;
    

    这个示例显示了每个员工的当前工资和下一个员工的工资。

示例数据集

假设我们有一个名为 business 的表,内容如下:

nameorderdatecost
Alice2017-04-01100
Bob2017-04-05150
Alice2017-04-10200
Charlie2017-05-01300
Bob2017-05-10100
Alice2017-05-15250
Charlie2017-06-01400

SQL 查询运行结果

1. 查询在2017年4月份购买过的顾客及总人数

SELECT name, COUNT(*) OVER() 
FROM business
WHERE SUBSTRING(orderdate, 1, 7) = '2017-04';

结果:

nameCOUNT(*)
Alice3
Bob3
Alice3
2. 查询顾客的购买明细及月购买总额

顾客购买明细及购买总额:

SELECT name, orderdate, cost, SUM(cost) OVER() 
FROM business;

结果:

nameorderdatecostSUM(cost)
Alice2017-04-011001300
Bob2017-04-051501300
Alice2017-04-102001300
Charlie2017-05-013001300
Bob2017-05-101001300
Alice2017-05-152501300
Charlie2017-06-014001300

明细及月购买总额:

SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY MONTH(orderdate)) 
FROM business;

结果:

nameorderdatecostSUM(cost)
Alice2017-04-01100300
Bob2017-04-05150300
Alice2017-04-10200300
Charlie2017-05-01300700
Bob2017-05-10100700
Alice2017-05-15250700
Charlie2017-06-01400400

顾客购买明细及顾客购买总额:

SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY name) 
FROM business;

结果:

nameorderdatecostSUM(cost)
Alice2017-04-01100550
Bob2017-04-05150250
Alice2017-04-10200550
Charlie2017-05-01300700
Bob2017-05-10100250
Alice2017-05-15250550
Charlie2017-06-01400400

顾客购买明细及顾客月购买总额:

SELECT name, orderdate, cost, SUM(cost) OVER(PARTITION BY name, MONTH(orderdate)) 
FROM business;

结果:

nameorderdatecostSUM(cost)
Alice2017-04-01100300
Bob2017-04-05150150
Alice2017-04-10200300
Charlie2017-05-01300300
Bob2017-05-10100100
Alice2017-05-15250250
Charlie2017-06-01400400
3. 按照日期进行累加

按照日期逐步累加购买总额

SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate) 
FROM business;

方法2(边界从起点到当前行):

SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sample4
FROM business;

结果:

nameorderdatecostSUM(cost)
Alice2017-04-01100100
Alice2017-04-10200300
Alice2017-05-15250550
Bob2017-04-05150150
Bob2017-05-10100250
Charlie2017-05-01300300
Charlie2017-06-01400700

当前行和前面一行的聚合:

SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS sample5
FROM business;

结果:

nameorderdatecostsample5
Alice2017-04-01100100
Alice2017-04-10200300
Alice2017-05-15250450
Bob2017-04-05150150
Bob2017-05-10100250
Charlie2017-05-01300300
Charlie2017-06-01400400

当前行和前后各一行的聚合:

SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sample6
FROM business;

结果:

nameorderdatecostsample6
Alice2017-04-01100300
Alice2017-04-10200550
Alice2017-05-15250250
Bob2017-04-05150250
Bob2017-05-10100100
Charlie2017-05-01300700
Charlie2017-06-01400400

当前行及后面所有行:

SELECT name, orderdate, cost,
SUM(cost) OVER(PARTITION BY name ORDER BY orderdate ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS sample7
FROM business;

结果:

nameorderdatecostsample7
Alice2017-04-01100550
Alice2017-04-10200250
Alice2017-05-15250250
Bob2017-04-05150100
Bob2017-05-10100100
Charlie2017-05-01300400
Charlie2017-06-01400400
4. 查询顾客上次的购买时间

使用 LAG 函数:

SELECT name, orderdate, cost,
LAG(orderdate, 1) OVER(PARTITION BY name ORDER BY orderdate) AS last_purchase_date
FROM business;

结果:

nameorderdatecostlast_purchase_date
Alice2017-04-01100NULL
Alice2017-04-102002017-04-01
Alice2017-05-152502017-04-10
Bob2017-04-05150NULL
Bob2017-05-101002017-04-05
Charlie2017-05-01300NULL
Charlie2017-06-014002017-05-01
http://www.lryc.cn/news/455225.html

相关文章:

  • No.12 笔记 | 网络基础:ARP DNS TCP/IP与OSI模型
  • OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例
  • 简单易懂的springboot整合Camunda 7工作流入门教程
  • LabVIEW提高开发效率技巧----点阵图(XY Graph)
  • C++-匿名空间
  • jdk的安装和环境变量配置
  • 继承、Lambda、Objective-C和Swift
  • 设置服务器走本地代理
  • 刷题 -哈希
  • React响应式修改数组和对象
  • cerbot https证书免费自动续期
  • 嵌入式硬件设计
  • 2024.09.24 校招 实习 内推 面经
  • GIT安装及集成到IDEA中操作步骤
  • Java使用线程池创建线程
  • mysql UDF提权(实战案例)
  • 【瑞昱RTL8763E】刷屏
  • 【黑马点评】使用RabbitMQ实现消息队列——3.使用Jmeter压力测试,导入批量token,测试异步秒杀下单
  • 第 21 章 一条记录的多幅面孔——事务的隔离级别与 MVCC
  • javaScript操作dom的事件(3个案例+代码+效果图)
  • 国庆期间的问题,如何在老家访问杭州办公室的网络呢
  • 动态规划算法——三步问题
  • 【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法
  • React学习01 jsx、组件与组件的三大属性
  • 项目——超级马里奥——Day(3)
  • 测试-BUG篇
  • vue2中 vue-count-to组件让数字从某个数字动态的显示到某个数字(后附vue3的用法)
  • AI模型部署初认识
  • 在线生成论文的网站有哪些?分享5款AI一键原创论文免费网站
  • 考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)