rows和range的区别--窗口函数
创作时间:
作者:
@小白创作中心
rows和range的区别--窗口函数
引用
CSDN
1.
https://m.blog.csdn.net/weixin_58468790/article/details/140876967
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.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 betweeninterval 2 daypreceding and current row
hive: range between2preceding 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
;
热门推荐
葫芦的象征意义及寓意(探秘葫芦的神奇力量与深刻含义)
Example
Windows系统安全如何防止恶意广告软件
维C银翘片使用说明指导
“杭州之路”,重新定义创业者的应许之地
从“国家级”到“国家级” 杭州未来科技城如何“进阶”?
使用 Microsoft Visio 设计 Power Automate 流程
小六壬详解十二长生
国际赛 吉尔吉斯U20VS中国U20:比赛分析
国际赛 吉尔吉斯U20VS中国U20:比赛分析
面试之后要不要主动询问面试结果?
被“脚本狗”背刺后,盗取炉石金币的“普罗米修斯”死了
有一种私心叫做班主任“调座位”,看似公平,实则满是套路
北京公司注册:如何建立公司内部的审计与监督机制?
拍《唐探》的陈思诚:电影圈牛马成不了艺术家
《好东西》票房破5亿,是谁在N刷反复看?
孩子语言发育的每个阶段,家长要如何引导?
甜蜜蜜,解读经典老歌背后的音乐故事与歌谱分析
Unity中的Shader是什么?如何使用?
潭柘寺:北京最古老的古寺,九龙拱卫,十景环抱
什么是医学信息学?
燃!中国“人造太阳”创造“亿度千秒”世界纪录
眼球运动与代偿头位的检查
15万到20万合资B级车选购指南:雅阁、凯美瑞、天籁对比分析
跨座式单轨结构(轨道梁与车辆)
中车助力“重庆造”轨道交通列车走向世界
边送外卖边学习?巴南区这一政策圆新就业群体大学梦
微信防封后如何确保账号不被关联封禁?
人工智能时代的职业变迁:我们如何重新规划未来?
150家企业提供5000个就业岗位,湖北荆州举行新春后首场招聘会