week07day01(窗口函数)

news2024/11/18 1:49:30

一. 窗口函数的定义和一些规范:

  • 对数据进行分区,数据的样式是不改变的,但是会多添加一列。
  • 窗口函数只能写在"结果集"中。

二. 排名函数

1. rank()    over()

例题:对每个人的消费金额进行排名:
  • rank() 排名函数
  • over()窗口函数:over(partition by 字段  order by 字段  asc|desc) 
  • partition( 分区 ) by  "分区的依据"
  • over() 的结果是一个独立的数据表,只有一列排序的号码,最后添加一列与原表合并
rank() over()的缺点 :
  •      他是排名函数,但是当有多个相同的数值排名相同时,会导致排名断层,举例如下,当存在 1 ,2,3,3,5。 这种排名时,因为存在两个3,所以不会有第四名的存在。
rank() 排名函数
over()窗口函数:over(partition by 字段  order by 字段  asc|desc) 
partition( 分区 ) by  "分区的依据"
select 
	uid,
	sum(amount)as amt,
    rank() over(order by sum(amount) desc) #(这里意思是按照sum(amount)从大到小排序,
                                                        #数字最大的排名为1)

from orderinfo
where `ispaid`= "已支付"
GROUP BY uid
order by amt desc # 这里的desc是对sum(amount)进行降序排列
limit 20

 2. row_number() over()  行编号

  • 行编号,无论值大小,只负责编号。即使分数一样例如:99, 99。 但是他们的排名时第一名和第二名。单纯的记录行号

3. dense_rank()  over() 排名函数

  • 他和rank()over() 不同 , dense_rank() 碰到相同的数值会进行并列,不会出现排名的断层。

  • rank() : 排名函数,会把数值相同的 并列排名,跳过并列排名的名次 , 导致排名断层
  • row_number() : 计算当前的 行号函数,不会把数值相同的 并列排名, 导致排名不准确
  • dense_rank() : 排名函数,会把数值相同的 并列排名,不会导致排名断层
窗口函数当中分区只是生成一个计算列而已,不会对原数据的形状进行改变,最终和源数据合并
over(partition by  order by)
	- partition by  分区依据 (group by 分组依据)
	- order by 排序
	- rows

三. 移动、上下选位窗口函数

1. lag(column(获取那一列,可以是计算列) , 行数) : 向上获取数据, 向上访问几行

解释:

  • 环比增长额是下个月 - 上个月的消费额度
  • lag(sum(amount),1) 意思是选取上一行的数据
select 
DATE_FORMAT(paidtime,"%Y-%m-01") as 年月, 
sum(amount) as amt,
lag(sum(amount),1) over() 上期增长,
lag(sum(amount),1) over() - sum(amount) 环比增长额
from `orderinfo`
where ispaid ="已支付"
group by 年月

2.  lead(column(获取那一列,可以是计算列) , 行数): 向下获取数据

四. 分区函数

1. partition by 

  • partition by 对原始数据 做分组,但是不会改变数据的行数

    不能直接使用当前结果集中的 计算列名,但是可以自主 从新计算字段

例题: 计算每个订单占当月订单的份额 
select 
#这是设置格式为 年-月-01
DATE_FORMAT(paidtime,"%Y-%m-01") as 年月,
#每一笔订单的金额
`amount` 订单金额,
#按照年-月-01分区,就是3月 4月 5月,计算sum(amount),也就是每个月的总额 
sum(amount) over(partition by DATE_FORMAT(paidtime,"%Y-%m-01")) as 月总额,
# 这个除法就是计算每笔订单 占单月订单的份额
`amount` / sum(amount) over(partition by DATE_FORMAT(paidtime,"%Y-%m-01")) as 总额百分比
from orderinfo 
where ispaid = "已支付"
order by DATE_FORMAT(paidtime,"%Y-%m-01") asc
例题: 计算每个月订单额占总额的份额
select *,
# 对每个不同月总额求和 就是 年总额
sum(月总额) over(partition by year(年月)) as 年总额,
# 月总额 / 年总额
月总额/sum(月总额) over(partition by year(年月)) 月份占总额比
from
(
# 子查询结果是每个月的总额
	select 
    # 把时间规范成 年 -月 ,结果是 三个不同的月份
	DATE_FORMAT(paidtime,"%Y-%m-01") as 年月,
  # 统计出每个月的总额
	sum(amount) as 月总额
	from orderinfo
	where ispaid = "已支付"
	GROUP BY 年月
) as tmp

不使用窗户函数做法:


select 
	DATE_FORMAT(paidtime,"%Y-%m-01") as 年月,
	sum(amount) as 月总额,
	# 通过year函数,选择2016的进行求和,这样就和结果就是年度总额
	(select sum(amount) from orderinfo where ispaid = "已支付" and year(paidtime)),
	sum(amount) /(select sum(amount) from orderinfo where ispaid = "已支付" and year(paidtime))
	from orderinfo
	where ispaid = "已支付"
	GROUP BY DATE_FORMAT(paidtime,"%Y-%m-01")

五. 分桶函数

  • 分桶函数一般是对 数字 进行划分的
  • 实际上,分桶函数会根据现有的数值和桶数按照比例划分,例如100个数据,10个桶,他会均衡的进行划分,如果加上 partition by 会在当前分区中进行划分 

       ntile(桶的数量)  over (partition by)

# 在外部进行group by
select gp,count(*)
from
(
select *,
ntile(3) over() as gp
from 
(
select *
from userinfo
order by uid
limit 20 
) as tmp
)as tmp1
group by gp

 这样就是按照uid的顺序 因为limit 20了, 他就会按照20个 等分为3等份


partition by 的方式划分

# 这种就是按照性别 男生中划分3个,女生中也划分三个
select *,
ntile(3) over(partition by sex) as gp
from 
(
select *
from userinfo
order by uid
limit 20 
) as tmp

手动划分

CREATE FUNCTION agegp(age INT) RETURNS VARCHAR(32) DETERMINISTIC
BEGIN
    IF age < 18 THEN
        RETURN '未成年人';
    ELSEIF age < 36 THEN
        RETURN '青年';
    ELSEIF age < 51 THEN
        RETURN '壮年';
    ELSEIF age < 61 THEN
        RETURN '年轻老人';
    ELSEIF age < 76 THEN
        RETURN '老人';
    ELSE
        RETURN '大龄老人';
    END IF;
END

# 将 表中的age 传入 上面函数中,上面的函数就是划分
select * , agegp(age) as gp from
(select *,year(now()) - year(birthday) as age from `userinfo` 
where birthday is not null and sex is not null 
) as tmp

六. first_value() 和 last_value()

first_value(字段) ,不分区 得到的是整理数据中的第一个(受到排序的影响)
first_value(字段)  over(partition by sex),分区,会获取每个分区中的第一个(受到排序的影响)

select *,
FIRST_VALUE(uid) over(partition by sex ) as try
FROM
(
select * from 
userinfo 
where sex is not null
limit 20
) as tmp

七. 百分位累计分布

  •  cume_dist() over(order by 字段 desc) 
  • 返回的是位置比例 : 从小到大,并且去重  
  • 计算公式 1 / 去重数量  * 位置索引(从1开始的)
select sex,cume_dist() over(partition by sex order by birthday) as cum from
(
select * from userinfo LIMIT 20

)as tmp

他这个就是按照sex分类的,这个函数就是:例如第一个女生的cum是0.14,他是女生的认识有 7个,第一个女生就是1/7,第二个就是2/8

八. 百分位排名

  •  percent_rank() 百分位排名
  • 生成一个课排序列
select uid,
				amt,
				sex,
			  cume_dist() over(order by amt) as cum,
				PERCENT_RANK() over(order by amt) as per
from
(select uid, round(sum(amount))as amt
from orderinfo 
where ispaid = "已支付"
GROUP BY uid 
) tmp
join userinfo 
using(uid)
order by amt desc

九.  rows 和 range

rows()

UNBOUNDED PRECEDING: 指定窗口从第一行开始,到当前行结束。
1 PRECEDING: 指定窗口从当前行 向前数 n 行开始,到当前行结束。
CURRENT ROW: 指定窗口仅包含当前行。
1 FOLLOWING: 指定窗口从当前行向后数 n行开始,到当前行结束。
UNBOUNDED FOLLOWING: 指定窗口从当前行开始,一直到最后一行结束。
over(parition by 字段  order by 字段 desc|asc rows between 关键字 and 关键字) 
over(parition by 字段  order by 字段 desc|asc rows between 关键字 and 关键字)
# 这里是向前找一行,在往后找一行,和中间自己这一行
select uid,sum(uid) over(rows between 1 preceding and 1 following) as abc
from
(select 
*
from userinfo limit 10)as tmp

range()

用rows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Android的教学课程系统设计与开发

摘 要 移动应用已经成为人们生活必不可缺的一部分&#xff0c;大学生身为移动应用的最大用户群体&#xff0c;在生活学习娱乐各个方面都与移动应用有着紧密联系&#xff0c;然而针对大学生校园学习的移动应用却寥寥无几&#xff0c;因为不同的学校&#xff0c;甚至不同的院系&…

unity显示当前时间

1建立文本组件和一个空对象 2创建一个脚本并复制下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine;public class showtime: MonoBehaviour {public TextMeshProUGUI time;private void Update(){string currentTime Sy…

抖音开放平台第三方开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 抖音小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一个…

Clearview X for mac v3.5.0 电子书阅读器 兼容 M1/M2/M3

应用介绍 Clearview X 是 macOS 上的一款简洁易用且美观大方的电子书阅读器。直观好用的图书管理功能&#xff0c;支持 PDF, Epub, MOBI, CHM, FB2, CBR, CBZ 等流行的电子书格式&#xff0c;可以方便地添加注解&#xff0c;插入书签&#xff0c;及迅速的搜索查找。支持在不同…

基于Springboot的高校竞赛管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校竞赛管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

C#/WPF 清理任务栏托盘图标缓存

在我们开发Windows客户端程序时&#xff0c;往往会出现程序退出后&#xff0c;任务还保留之前程序的缓存图标。每打开关闭一次程序&#xff0c;图标会一直增加&#xff0c;导致托盘存放大量缓存图标。为了解决这个问题&#xff0c;我们可以通过下面的程序清理任务栏托盘图标缓存…

深度学习_AlexNet_2

目标 知道AlexNet网络结构能够利用AlexNet完成图像分类 2012年&#xff0c;AlexNet横空出世&#xff0c;该模型的名字源于论文第一作者的姓名Alex Krizhevsky 。AlexNet使用了8层卷积神经网络&#xff0c;以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证明了学习到…

安卓studio安装(从安装到配置到helloworld)

安卓studio安装 2024.3.11官网的版本&#xff08;有些翻墙步骤下载东西也解决了&#xff09; 这次写的略有草率&#xff0c;后面会更新布局的&#xff0c;因为截图量太大了&#xff0c;有需要的小伙伴可以试着接受一下哈哈哈哈 !(https://gitee.com/jiuzheyangbawjf/img/raw/ma…

【webrtc】m122:BitrateProber 源码阅读与分析

pacing controller 需要 bitrate prober Pacing模块中存在一个BitrateProber prober_的成员变量,专门用来处理带宽探测 大神的分析也是基于最新版本webrtc的:ProbeController每次可能会生成多个探测源数据ProbeClusterConfig,其中每个源数据ProbeClusterConfig对应一个探测簇…

软件杯 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

C++Qt学习——Qt信号槽

信号和槽是Qt编程的基础&#xff0c;他们的存在使得在Qt中处理界面各个组件的交互操作变得更加直观简单。信号&#xff08;SUGNAL&#xff09;&#xff1a;也就是发送者发送的函数信号&#xff0c;例如PushButtun最常见的信号就是鼠标单击的时候发射的click()信号槽&#xff08…

华为配置ISP选路实现报文按运营商转发

CLI举例&#xff1a;配置ISP选路实现报文按运营商转发 介绍通过配置ISP选路实现报文按运营商转发的配置举例。 组网需求 如图1所示&#xff0c;FW作为安全网关部署在网络出口&#xff0c;企业分别从ISP1和ISP2租用一条链路。 企业希望访问Server 1的报文从ISP1链路转发&#…

Python机器学习预测+回归全家桶,新增TCN,BiTCN,TCN-GRU,BiTCN-BiGRU等组合模型预测...

截止到本期&#xff0c;一共发了4篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&#xff01; 2.机器学习预测全家桶-Python&#xff…

el-table中 el-popover 性能优化

场景&#xff1a;在 el-table 中使用 el-popover ,出现了 loading 加载卡顿的问题&#xff0c;接口返回的数据的时间大概是 140ms &#xff0c;所以不是接口慢的原因&#xff1b;通过对表中结构的逐步排查&#xff0c;发现是表中的 某一行 所影响的&#xff1b;并且 其中含有 e…

qt 汉字输出 中文输出 显示乱码 qDebug() 乱码 解决

要正确显示汉字&#xff0c;必须要先了解计算机文字编码相关知识&#xff0c;参考&#xff1a;unicode ucs2 utf16 utf8 ansi GBK GB2312 互转 及 渲染_ucs2编码转换-CSDN博客 1、汉字输出到 应用程序输出面板 qt 自定义的输出类qDebug() 、QDebug对象、QMessageLogger默认输…

单例模式及线程安全的实践

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 引言基本的单例模式长啥样&#xff1f;怎样才能线程安全&#xff1f;**懒汉模式** ( 双 重 检 查 ) &#x1f389;总结&#x1f389; 引言 单例模式是个…

WebPack自动吐出脚本

window.c c; window.res ""; window.flag false;c function (r) {if (flag) {window.res window.res "${r.toString()}" ":" (e[r] "") ",";}return window.c(r); }代码改进了一下&#xff0c;可以过滤掉重复的方…

酷开科技发力研发酷开系统,让家庭娱乐生活更加丰富多彩

在这个快节奏的社会&#xff0c;家庭娱乐已成为我们日常生活中不可或缺的一部分&#xff0c;为了给家庭带来更多欢笑与感动&#xff0c;酷开科技发力研发出拥有丰富内容和技术的智能电视操作系统——酷开系统&#xff0c;它集合了电影、电视剧、综艺、游戏、音乐等海量内容&…

腾讯云和阿里云4核8G云服务器多少钱一年和1个月费用对比

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

6.S081的Lab学习——Lab1: Xv6 and Unix utilities

文章目录 前言一、启动xv6(难度&#xff1a;Easy)解析&#xff1a; 二、sleep(难度&#xff1a;Easy)解析&#xff1a; 三、pingpong&#xff08;难度&#xff1a;Easy&#xff09;解析&#xff1a; 四、Primes(素数&#xff0c;难度&#xff1a;Moderate/Hard)解析&#xff1a…