[SQL挖掘机] - 窗口函数 - 计算移动平均
介绍:
在窗口函数使用时,计算的是累积到当前行的所有的数据的相关操作。 实际上,还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。
其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的.
之前我们介绍的窗口函数是根据partition by进行分组, 然后根据order by进行排序, 最后根据两者的一个结果输出对应的窗口函数的对应结果, 比如求和, 排序等. 也就是说, 目前的窗口就是该分组内从该组最开始的数据到计算的当前行的数据.
用法:
接下来, 就介绍这个窗口该如何进行设置:
<窗口函数> over (order by <排序用列名> rows n preceding ) <窗口函数> over (order by <排序用列名> rows between n preceding and n following)
其中,
- preceding: 当前行以及之前 xxx 行, 多少行由前面的
n指定; - following: 当前行以及之后 xxx 行, 多少行由前面的
n指定;
也介绍一些其他格式, 在窗口函数中,主要有以下几种形式的rows子句:
- “rows unbounded preceding”: 这表示窗口范围从无限制的开始,一直延伸到当前行。换句话说,它会考虑当前行及其之前的所有行。
- “rows n preceding”: 这表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
- “rows between unbounded preceding and current row”: 这表示窗口范围从无限制的开始,一直延伸到当前行。这样的语法也会包括当前行在内。
- “rows between n preceding and current row”: 这表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
- “rows between current row and unbounded following”: 这表示窗口范围从当前行开始,一直延伸到无限制的结束。这样的语法会包括当前行在内,并考虑当前行之后的所有行。
注意,上述仅列举了一些常见的rows子句形式,实际上你可以根据具体需求来组合和使用不同的rows子句,以定义窗口函数的行范围。
对于"following",它通常与"preceding"结合使用来定义窗口函数的行范围。
- “rows n following”: 这表示窗口范围从当前行的后n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之后的n行。
- “rows between current row and n following”: 这表示窗口范围从当前行开始,一直延伸到当前行的后n行。这样的语法会包括当前行在内,并考虑当前行之后的n行。
- “rows between unbounded preceding and n following”: 这表示窗口范围从无限制的开始,一直延伸到当前行的后n行。这样的语法会考虑当前行及其之前的所有行,并且还包括当前行之后的n行。
需要注意的是,在使用"following"时,窗口函数将根据当前行为基准,在当前行的前/后指定的行数范围内进行计算。如果没有明确指定"preceding"或"following",默认情况下会假定为"preceding"。
拓展:
这里可能有些同学会有些疑问, 同时我个人也有一些疑问:
"rows between n preceding and current row" 和 "rows n preceding" 的区别是?
“rows between n preceding and current row” 和 “rows n preceding” 在使用窗口函数中有一些区别。
“rows between n preceding and current row” 表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法会包括当前行在内,并考虑当前行之前的n行。
举个例子,如果有一个结果集包含了10行数据,而你使用的窗口函数语法是"rows between 2 preceding and current row",那么对于第5行,窗口函数将计算从第3行到第5行的数据。
另一方面,“rows n preceding” 表示窗口范围从当前行的前n行开始,一直延伸到当前行。这样的语法也会包括当前行在内,并考虑当前行之前的n行。
区别在于"rows between n preceding and current row" 是窗口函数的一部分,用于定义窗口的起点和终点,使我们可以在范围内进行计算。而"rows n preceding" 则表示只计算当前行之前的n行,没有定义在窗口内的其他行。
简而言之,“rows between n preceding and current row” 定义了一个窗口范围,包括当前行及其之前的n行。而"rows n preceding" 只表示计算当前行之前的n行数据,没有定义窗口范围。
这样两者的优缺点是?
优点:
“rows between n preceding and current row”:
具备更灵活的窗口范围定义能力,可以根据实际需求定义窗口的起点和终点。
适用于需要在当前行及其之前的一定范围内进行复杂计算或分析的场景。
“rows n preceding”:
简洁明了,只计算当前行之前的固定行数,不需要定义窗口范围。
在只需要简单地获取当前行之前某个固定行数的数据时,使用较为方便。
缺点:
“rows between n preceding and current row”:
尽管提供了灵活性,但语法上相对复杂一些,需要指定起点和终点,可能需要更长的语句来表达窗口范围。
“rows n preceding”:
无法定义窗口范围,只能计算固定行数的数据,不适用于需要更复杂的窗口计算场景。
不支持动态调整窗口大小,只能固定在当前行之前的特定行数。
总体而言,选择使用哪种形式取决于具体的需求和计算场景。如果需要更精细的窗口范围定义和复杂的计算,建议使用"rows between n preceding and current row"。如果仅需要获取当前行之前固定行数的数据,可以选择"rows n preceding"。
但是实现的效果应该是一样的吧?
是的,从计算结果的角度来看,“rows between n preceding and current row” 和 “rows n preceding” 在大多数情况下会得到相同的结果。两者都可以用于限定窗口函数计算的行范围,并获取相同的数据。
然而,这两种语法的主要区别在于语义和灵活性。“rows between n preceding and current row” 提供了更明确和灵活的方式来定义窗口范围,使得代码更加易读和可维护。它允许我们更准确地控制窗口的起点和终点。而 “rows n preceding” 则是一种简化的形式,只能计算固定行数的数据,并且无法指定窗口的终点。
因此,虽然实现的效果可能是相同的,但选择使用适当的语法形式可以提高代码的可读性和可维护性。根据具体的需求和场景选择合适的语法形式是很重要的。
相关文章:
[SQL挖掘机] - 窗口函数 - 计算移动平均
介绍: 在窗口函数使用时,计算的是累积到当前行的所有的数据的相关操作。 实际上,还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。 其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的. 之前我们介绍的窗口函数是根据partition…...
域名和hostname
最近用git克隆远程仓库时总是超时,报错说是代理的问题,但打开和关闭代理都没能解决问题,后面了解到可以关闭git命令的全局代理: git config --global --unset http.proxy git config --global --unset https.proxy如果下次要用的…...
echarts 甘特图一组显示多组数据
<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…...
1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏
1139. 最大的以 1 为边界的正方形 核心思想:枚举正方向的右下角坐标(i,j),然后你只需要判断四条边的连续一的最小个数即可,这里是边求连续一的个数同时求解结果。 087. 网格图中机器人回家的最小代价 核心…...
css滚动条的使用
前言: css滚动条的使用。 1、使用案例1:背景不要,只展示一个滚动条 如果是默认整体,::就够用了,如果是某个元素,可以 .abc:: ,如果是scss这种的 &:: ::-webkit-scrollbar {width: 6px; } ::-webkit…...
优化Python代理爬虫的应用
当我们在资源受限的环境中使用Python代理爬虫时,我们需要采取一些优化措施,以确保程序的高效性和稳定性。在本文中,我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解,哪些情况算是资源…...
[C++] STL_vector使用与常用接口的模拟实现
文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back(重点)3.2 pop_back(重点)3.3 operator[](重点)3.4 insert3.…...
【LeetCode】167. 两数之和 II - 输入有序数组 - 双指针
目录标题 2023-8-23 09:25:08 2023-8-23 09:25:08 自己写的不是常量级的额外空间,但是写出来了,记录一下。 下次写的时候,请用双指针。 (其实我想了想一想,双指针就没感觉出来:因为我只想到双指针两个都…...
YOLOV1
YOU ONLY LOOK ONCE...
美团增量数仓建设新进展
摘要:本文整理自美团系统研发工程师汤楚熙,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 建设背景核心能力设计与优化业务实践未来展望 点击查看原文视频 & 演讲PPT 一、美团增量数仓的建设背景 美团数仓架…...
LeetCode解法汇总2337. 移动片段得到字符串
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你两个字…...
Fpass与Fstop
在MATLAB中,“Fpass”、“Fstop”、"Apass"和"Astop"是数字滤波器设计中常用的参数。它们用于定义滤波器的频率响应和滤波器的性能。 "Fpass"表示通带频率,指的是滤波器允许通过的频率范围。在数字滤波器设计中࿰…...
Java快速入门体验
Java快速入门体验 一、环境信息1.1 硬件信息1.2 软件信息 二、Maven安装2.1 Maven介绍2.2 Maven安装包下载2.3 Maven安装2.4 Maven初始化 三、Java安装3.1 JDK下载3.2 JDK安装3.3 JDK初始化 四、开发环境搭建4.1 安装开发工具4.2 关联Maven环境4.2.1 新建JAVA项目4.2.2 Maven与…...
父组件传给子组件的数据是异步的,为什么会导致子组件比父组件先执行?
当父组件传递给子组件的数据是异步获取的时候,可能会导致子组件先执行的问题。这是因为在 Vue 的更新机制中,当组件的模板开始渲染时,会立即触发子组件的创建和挂载过程,而父组件的数据可能还没有完全加载完成。 具体来说…...
泛型编程 学习笔记
#include "iostream"using namespace std;template<typename T> void Print(T a) {cout << a << endl; }int main() {int a 5;double b 2.3;char c e;string d "sdfasd";Print(a);Print(b);Print(c);Print(d);return 0; } 它可以不用…...
电脑文件删除了可以找回吗?分享一种简单恢复删除电脑文件办法!
电脑文件删除了可以找回吗?可以。在原理上讲电脑删除的文件是有希望恢复的,因为操作系统在删除文件的时候并会不会立刻将文件彻底删除。当文件被删除的时候,其文件记录被删除,并且被文件占用的磁盘空间被标记为空闲。 这样对于用户…...
Pygame编程(4)event模块
Pygame编程(4)event模块 函数示例 函数 pygame.event.pump 让 Pygame 内部自动处理事件pygame.event.get 从队列中获取事件pygame.event.poll 从队列中获取一个事件pygame.event.wait 等待并从队列中获取一个事件pygame.event.peek 检测某类型事件是否在…...
Python数据采集实战-使用BeautifulSoup框架解析HTML文档并提取所需内容(附源码和实现效果)
实现功能 使用BeautifulSoup框架解析HTML文档并提取所需内容的例子:假设我们要从以下HTML文档中提取所有超链接的链接地址 实现代码 from bs4 import BeautifulSoup import requests# 发送请求并获取HTML文档 url "https://www.baidu.com" response r…...
Java“牵手”天猫商品列表数据,关键词搜索天猫商品数据接口,天猫API申请指南
天猫商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取天猫商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问天猫商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…...
idea切换Git分支时保存未提交的文件
解决方案 我们现在有三个分支,如下图: 我们目前在tenant分支上进行开发,需要去修复master的Bug,假设我们在tenant分支上修改了一个文件,如下图: 方法一:使用Shelve Changes 1、选中tenant上你不…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
