SQLServer三种开窗函数详细用法
作者:悲且狂 发布时间:2024-01-20 09:03:00
一,开窗函数的语法
开窗函数的语法为:over(partition by 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。
二,从聚合开窗函数sum(score) over(partition by name )讲起
实不相瞒我看一眼就会了(假的,其实这种又臭又长的字实在懒得看)
sum(score) over(partition by name )
sum()是聚合函数,其实我聚合函数还没学明白,当 sum()函数 后面跟上 over()以后,由sum聚合函数就成为了开窗函数。
over() 括号里面就是定义窗口的内容了,partition 是分区,分组的意思。partition by 就是根据某个字段分组。
所以sum(score) over(partition by name ) ,就是先根据 name 分组(如图),当前面加了sum(score)后就把根据name分组后的,每个(组)窗口里面的字段 score进行求和操作。
select *,sum(score) over(partition by name) sum窗口函数举例
from kchs
-- 为了简单就只有两个字段,name和score
聚合函数同样需要对数据进行排序,但不会显示排名结果。会将当前名次的数据 与 排在这之前的所有数据 依次做相应的计算。
执行语句:
select *,
sum(score) over (order by id) as 累加求和
from kchs
拓展一下:
一,很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。
二,和gropu by 不同的是窗口函数会生成多行,而不是想group by 一样只有一行
三,开窗函数之first_value,last_value,lead,lag
first_value:是在窗口里面取到第一个值
first_value(score) over( partition by name)as first_score ,
根据name分区(组),取score列的第一个值
last_value:是在窗口里面取到最后一个值
last_value(score) over(partition by name) as last_score
--根据name分区(组),取score列的最后一个值
lead 是取当前行的上 N 条数据,并且可以设置默认值
lead(score,1,0) over(partition by name ) as lead_score
--根据name分区(组),score列当前行的上面N行,,如果没有就为默认值0
lag 是取当前行的下 N 条数据,并且可以设置默认值
lag(score,1,0) over(partition by name ) as lag_score
--根据name分区(组),score列当前行的下面N行,如果没有就为默认值0
四,排名开窗函数ROW_NUMBER、DENSE_RANK、RANK
row_number ()是为每组的行设置一个连续的递增的数字(123456)
ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score
rank()是排名,也为每一组的行生成一个序号,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如:有三个人并列第一名,第四名序号为四(111456)
rank() over(partition by name order by score asc) as RANK_score
DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。例如:有三个人并列第一,第四名序号为2(111234)
DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score
注意:
一,排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
二,ORDER BY 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
三,PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。
来源:https://blog.csdn.net/baomingshu/article/details/111945681
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 数据准备student 表CREATE TABLE `student` ( `student_id` varchar(50) N
- 前言在做接口自动化的时候,经常会遇到一些参数是需要加密的,比如密码参数。加密规则一般开发也不愿意告诉你,会直接给你一个jar包,让你调用ja
- 当出现直接在pycharm安装一个包很久装不上或者直接失败时,我们选择另一种方式。例如安装pandas包:win+r输入cmd,在cmd中输
- 前言编写条件分支代码是编码过程中不可或缺的一部分。如果用道路来做比喻,现实世界中的代码从来都不是一条笔直的高速公路,而更像是由无数个岔路口组
- 有一天我突发奇想,要是我每到一个网站,那里都能立刻调出我需要看的信息,那岂非美妙得很。接下来我想更深入地考虑这个问题,坐到椅子上拿一支铅笔,
- 下面我们来看下,如何利用它来删除一个表中重复记录: If Exists(Select * From tempdb.Information_S
- 很多朋友问过我absolute与relative怎么区分,怎么用?我们都知道absolute是绝对定位,relative是相对定位,但是这个
- 1 PHP官网地址:PHP界面:2 下载官网下载地址:Download PHP 或者点击这里下载3 安装① 按照下图下载 php。
- 最近因为工作的需求,需要对mysql中数字进行格式化,但发现网上的资料较少,索性自己总结一下,方便自己也帮助有需要的朋友们,下面话不多说,来
- 前言PyGame 是一个专门设计来进行游戏开发设计的 Python 模块,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚,
- 菜鸟笔记首先读取的txt文件如下:AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90AAAAF1
- 如下所示:<span style="font-size:18px;"># -*- coding:utf-8
- 白噪声检验也称为纯随机性检验, 当数据是纯随机数据时,再对数据进行分析就没有任何意义了, 所以拿到数据后最好对数据进行一个纯随机性检验aco
- 目录一、前言二、Json.loads与eval 性能对比1. eval2. json.loads一、前言最近发现一些小伙伴使用eval来处理
- 目录开发环境主要文件:main.pyapp_main_window.pyTips多控件可以存在list中QApplication与QWidg
- 今天下午在练习python时用了“if...if...else...”的分支结构,结果运行出来吓我一跳。原来我想当然的认为“if...if.
- 来自 * 我们的大脑通常最多能感知三维空间,超过三维就很难想象了。尽管是三维,理解起来也很费劲,所以大多数情况下都使用二维平面。不过,我们
- 前言:HTML5和CSS3的时代到来了,新版2011版淘宝网首页已全部使用HTML5,拥抱变化才是王道。为之漫笔翻译的很好,看了一遍后,感觉
- 在使用selenium去获取淘宝商品信息时会遇到登录界面这个登录界面处理的难度在于滑动验证的实现,有的人使用微博登录,避免了滑动验证,那可不
- # 源码如下:#!/usr/bin/env python#coding=utf-8import osfrom PIL import Imag