首页 > 其他分享 >rows和range的区别--窗口函数

rows和range的区别--窗口函数

时间:2024-08-02 19:53:20浏览次数:9  
标签:RAND rows 07 FLOOR -- 2024 range 100

目录

1.rows和range关键字的区别

2.例题:

2.1  求最近三个月(前两个月和当前月)的累计销量

2.2  计算最近3个月(前两个月和当前月)的累计销量

1.rows和range关键字的区别

rows和range关键字,都可以用来定义window frame范围:

rows between 上限 and 下线
range between 上限 and 下线

区别:

 (1)rows是根据分区数据排序之后,每一行的row_number确定每行关联的window frame范围

(2)range是根据分区数据排序之后,每一行的排序列的值确定每行关联的window frame范围

举例说明:

求4月份最近3个月(即2,3,4月)的销售额,给出的月份为1,2,4,5,6。

用rows会按行向上求两行,求得是(1,2,4)份的销售额之和

用range会根据行值去求,取(2,3,4)月份,因为没有3月份的销售额,所以只求(2,4)的销售额之和

2.例题:

2.1  求最近三个月(前两个月和当前月)的累计销量

思路:求最近三个月的累计销量,用窗口函数,窗口大小是前两个月与当前月,

前两个月:2 preceding

当前月:current row

#建表
CREATE TABLE tb_sales (
    month int,
    sales int
)
;
#加载数据
insert into tb_sales
value
(1,10),
(2,20),
(2,23),
(4,5),
(5,32),
(6,22);

用rows实现:

# 需求:计算最近3个月的累计销量
select
    month, sales,
    sum(sales) over(
        order by month
        rows between 2 preceding and current row
    ) total
from tb_sales
;

用range实现:

# 需求:计算最近3个月的累计销量
select
    month, sales,
    sum(sales) over(
        order by month
        range between 2 preceding and current row
    ) total
from tb_sales
;

通过实践可以看出,求最近3个月的累计销售额时,如果月份之间有间隔,应该用range

2.2  计算最近3个月(前两个月和当前月)的累计销量
#建表
CREATE TABLE tb_sales (
    sale_date DATE,
    quantity INT
);

#插入数据
-- [0, 1) * 100 ==> [0, 100) + 1 ==> [1, 101)
INSERT INTO tb_sales (sale_date, quantity)
VALUES
('2024-07-01', FLOOR(RAND() * 100) + 1),
('2024-07-02', FLOOR(RAND() * 100) + 1),
('2024-07-03', FLOOR(RAND() * 100) + 1),
('2024-07-04', FLOOR(RAND() * 100) + 1),
('2024-07-05', FLOOR(RAND() * 100) + 1),
('2024-07-08', FLOOR(RAND() * 100) + 1),
('2024-07-09', FLOOR(RAND() * 100) + 1),
('2024-07-10', FLOOR(RAND() * 100) + 1),
('2024-07-11', FLOOR(RAND() * 100) + 1),
('2024-07-12', FLOOR(RAND() * 100) + 1),
('2024-07-13', FLOOR(RAND() * 100) + 1),
('2024-07-14', FLOOR(RAND() * 100) + 1),
('2024-07-15', FLOOR(RAND() * 100) + 1),
('2024-07-18', FLOOR(RAND() * 100) + 1),
('2024-07-19', FLOOR(RAND() * 100) + 1),
('2024-07-20', FLOOR(RAND() * 100) + 1),
('2024-07-21', FLOOR(RAND() * 100) + 1),
('2024-07-22', FLOOR(RAND() * 100) + 1),
('2024-07-23', FLOOR(RAND() * 100) + 1),
('2024-07-24', FLOOR(RAND() * 100) + 1),
('2024-07-25', FLOOR(RAND() * 100) + 1),
('2024-07-28', FLOOR(RAND() * 100) + 1),
('2024-07-29', FLOOR(RAND() * 100) + 1),
('2024-07-30', FLOOR(RAND() * 100) + 1),
('2024-07-31', FLOOR(RAND() * 100) + 1);
;

注意:当窗口函数通过日期进行排序时,设置窗口大小时,mysql的写法和hive有所不同

mysql:   range between interval 2 day preceding and current row

hive:  range between 2 preceding and current row

mysql的写法:

# 目标: 求最近3天的销售量 (mysql的写法)
select
    current_date(),
    date_add(current_date(), interval 3 day)
    ;

select
    sale_date, quantity,
    sum(quantity) over(
        order by sale_date
        range between interval 2 day preceding and current row
    ) total
from db_1.tb_sales
;

hive的写法:

# hive的写法
select
    sale_date, quantity,
    sum(quantity) over(
        order by sale_date
        range between 2 preceding and current row
    ) total
from db_1.tb_sales
;

标签:RAND,rows,07,FLOOR,--,2024,range,100
From: https://blog.csdn.net/weixin_58468790/article/details/140876967

相关文章

  • Navicat Premium(数据库管理) v17 授权版
    Navicat17全新升级,软件增强了数据库管理和数据分析的功能体验。其中包括模型设计与同步、数据字典、数据分析(dataprofiling)、用户体验、查询优化、BI功能集成MongoDB/Snowflake、专注模式、Redis哨兵模式与平台扩展LinuxARM等。此次升级让用户在数据库的创建、管理、......
  • mysql中的left join、right join 、inner join的详细用法
    1.innerjoin,内连接,显示两个表中有联系的所有数据。    当两个表中存在匹配的数据时,‌返回满足条件的SELECT结果。‌内连接只返回两个表中匹配的记录,‌如果某一方没有匹配的记录,‌则不会出现在结果集中。‌2.leftjoin,左链接,以左表为参照,显示所有数据,右表中没有......
  • 2024.8.2 test
    A有长度为\(n\)序列\(A\),你要把构造长度相同的序列\(B\)使得\(\sumB_i=m\)。满足随机打乱\(B_i\)后,期望\(\sum[A_i>B_i]\)最小,求这个值。\(n\le1000,m\le5000\)。我们考虑背包,也就是\(0\simm\)的数选\(n\)个出来,和为\(m\)。设\(sum_i\)表示\(A_i\)里......
  • 两个当前前端领域中好玩的新技术
    1.WebAssembly(Wasm)WebAssembly是一种新兴的技术,它允许在浏览器中运行高性能的低级代码。WebAssembly提供了一种可以在Web浏览器中运行的字节码格式,使得开发者可以用C、C++、Rust等语言编写代码,并将其编译为WebAssembly,在浏览器中高效运行。这种技术非常适用于需要高性......
  • Linux安装git
    方式一:yum安装1、安装依赖yuminstallcurl-develexpat-devel2、安装git,默认安装路径/usr/bin/gityum-yinstallgit-core3、验证是否安装成功git-v或者git--version方式二:手动安装1、下载安装包,https://git-scm.com/download/linux2、安装依赖yuminstal......
  • 数据权限的设计与思考
    什么是数据权限?权限控制是一个系统的核心功能,可以分为两类,一类是功能权限,一类是数据权限。数据权限又可以进一步分为行级权限和列级权限。功能权限,是指系统用户能进行哪些操作,通常是菜单和按钮权限,如打开订单菜单,查询订单列表,创建新订单。对于功能权限,有标准化的解决方案,也即RBAC......
  • dijkstra的封装模版
    /**-swj-*/>_____フ|__|/`ミ_xノ/|/ヽ?/ ̄|||||( ̄ヽ__ヽ_)_)\二つ**/#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;structDIJ{......
  • 优秀的树 - 题解(数学)
    优秀的树时间限制:C/C++2000MS,其他语言4000MS内存限制:C/C++256MB,其他语言512MB描述给定一棵树,其所有边权重均为\(1\),定义\(f(u)=Σ_vdis(u,v)\),v表示树上的所有结点,\(dis(u,v)\)表示结点\(u\)和\(v\)的简单路径的长度。一棵树被称为“优秀”,当且仅当存在两个......
  • JavaScript 中的闭包和事件委托
    包(Closures)闭包是JavaScript中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。闭包的定义简单来说,闭包是指有权访问另一个函数作用域中......
  • SSH远程连接
    ★配置Windows中OpenSSH的SSH配置文件配置步骤1.打开文件资源管理器,在地址栏中输入%USERPROFILE%\.ssh并按下回车键。如果系统中还没有.ssh文件夹,您需要手动创建这个文件夹。2.在.ssh文件夹内,使用文本编辑器(如记事本)创建一个新的文件,并将其命名为config3.......