数据库SQL Server窗口函数、聚合函数

文章目录

        • 窗口函数
          • 窗口函数分类
          • 窗口函数示例
          • 聚合函数示例
          • 注意事项
        • 流水表提取最新状态

窗口函数

SQL Server中的窗口函数(也称为分析函数)是一组非常强大的SQL功能,**它们允许你在结果集的行上执行计算,而不需要将结果集分组为多个输出行。**窗口函数可以对一组行执行计算,这组行与当前行相关,被称为窗口。窗口函数可以执行排名、聚合、行号分配等操作,而无需改变查询结果中的行数。

<窗口函数> OVER (  PARTITION BY <列名> -- 可选,用于将结果集划分为多个分区  ORDER BY <列名> -- 可选,用于在每个分区内对行进行排序  ROWS|RANGE BETWEEN <开始范围> AND <结束范围> -- 可选,定义窗口帧  
)
窗口函数分类
  • 排名函数:如ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE(n)等,用于对行进行排名或分组。
  • 聚合函数:如SUM()、AVG()、MIN()、MAX()、COUNT()等,但在这里它们不是对整个结果集进行聚合,而是对每个窗口进行聚合。
  • 分析函数:如LEAD()、LAG()、FIRST_VALUE()、LAST_VALUE()等,用于访问窗口中的其他行数据。
窗口函数示例

假设我们有一个名为Employees的表,包含DepartmentIDSalary列,我们可以使用ROW_NUMBER()窗口函数来为每个部门内的员工按薪水排序并分配一个唯一的行号:

SELECT   DepartmentID,  Salary,  ROW_NUMBER() OVER (PARTITION BY DepartmentID ORDER BY Salary DESC) AS SalaryRank  
FROM   Employees;

这个查询将结果集按DepartmentID分区,并在每个分区内按Salary降序排列,为每个分区内的行分配一个唯一的行号(SalaryRank)。

聚合函数示例

如果我们想计算每个部门内员工的平均薪水,但不想改变结果集中的行数(即仍然为每位员工显示数据),我们可以使用AVG()窗口函数:

SELECT   DepartmentID,  Salary,  AVG(Salary) OVER (PARTITION BY DepartmentID) AS AvgDepartmentSalary  
FROM   Employees;

这个查询将结果集按DepartmentID分区,并计算每个分区内薪水的平均值(AvgDepartmentSalary),但结果集中仍包含每位员工的记录。

注意事项
  • 窗口函数不会减少结果集中的行数,它们只是为每行添加了额外的计算列。
  • 窗口函数可以与GROUP BY子句结合使用,但通常它们用于那些不需要完全分组聚合的查询。
  • PARTITION BY子句是可选的,如果不使用,则整个结果集被视为一个单一的分区。
  • ORDER BY子句在窗口函数中通常是必需的,尤其是在使用排名函数或需要定义窗口帧时。然而,它仅用于定义窗口内的排序顺序,并不改变结果集的最终排序。
流水表提取最新状态

通过窗口函数ROW_NUMBER()对每家店铺进行分组,只提取更新时间最新的一条记录,之后再过滤valid_flag=1的店铺作为需要预警的店铺。

WITH RankedStores AS (SELECT  *,ROW_NUMBER() OVER (PARTITION BY store_id ORDER BY update_time DESC) AS rnFROM table1WHERE type='通用' and platform = 'tmall')SELECT  STRING_AGG(store_id,',')FROM  RankedStores
WHERE rn = 1 and valid_flag = 1

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

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

相关文章

React-tive优质开源项目

对于初学者来说&#xff0c;接触和学习React相关的优质开源项目是一个非常好的方式来提升编程技能&#xff0c;特别是对于理解React的实际应用和最佳实践。这里推荐几个React开源项目&#xff0c;它们通常会附带详细的文档和示例代码&#xff0c;帮助新手快速上手&#xff1a; …

Java中如何实现线程池的生命周期管理

1、创建线程池 使用Executors工厂类或者ThreadPoolExecutor的构造函数来创建线程池。通常&#xff0c;推荐直接使用ThreadPoolExecutor构造函数来明确指定线程池的参数&#xff0c;如核心线程数、最大线程数、空闲线程存活时间、工作队列等。 2、执行任务 通过调用线程池的s…

使用Charles mock服务端响应数据

背景 服务端未提供接口/服务端接口返回结果有逻辑限制&#xff08;次数限制&#xff09;&#xff0c;不能通过原始接口返回多次模拟预期的返回结果&#xff0c;例如边界值情况 客户端受到接口响应数据的限制&#xff0c;无法继续开发或测试&#xff0c;会极大影响开发测试效率…

Perl 数据类型

Perl 数据类型 Perl 是一种功能丰富的编程语言&#xff0c;广泛应用于系统管理、网络编程、GUI 开发等领域。在 Perl 中&#xff0c;数据类型是编程的基础&#xff0c;决定了变量存储信息的方式以及可以对这些信息执行的操作。本文将详细介绍 Perl 中的主要数据类型&#xff0…

QT滑块图片验证程序

使用QT实现滑块验证程序&#xff0c;原理是画个图片&#xff0c;然后在图片上画个空白区域&#xff0c;再画个滑块图片。 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widg…

文心智能体平台快速创建一个HY(Lisp)编程小助手

现在可以在文心智能体平台&#xff0c;使用文心一言创建各种智能体了&#xff01;创建步骤如下&#xff1a; 创建知识库 可以使用本地上传的方式来提交&#xff0c;鼠标移动到”查看模板“&#xff0c;可以下载”知识库外链上传示例模版.xlsx“&#xff0c;按照模板里的格式&…

8.14 矢量图层面要素2.5D渲染

文章目录 前言2.5D渲染QGis设置面符号为2.5D二次开发代码实现2.5D 总结 前言 本章介绍矢量图层面要素2.5D渲染的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 2.5D渲染 2.5D渲染可以将多边形渲染为类3D效果。 QGis设置面符号为2.5D 以"hou…

Swagger的原理及应用详解(十一)

本系列文章简介&#xff1a; 在当今快速发展的软件开发领域&#xff0c;特别是随着微服务架构和前后端分离开发模式的普及&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;的设计与管理变得愈发重要。一个清晰、准确且易…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境&#xff0c;可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o&#xff0c;大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

[Multi-Modal] MDETR 论文及代码学习笔记

代码地址&#xff1a;https://github.com/ashkamath/mdetr 论文地址&#xff1a;https://arxiv.org/abs/2104.12763 多模态推理系统依靠预先训练的目标检测器从图像中提取感兴趣区域&#xff08;边界框包围区域&#xff09;。然而&#xff0c;这个关键模块通常被用作黑匣子&…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…

白骑士的C语言教学进阶篇 2.2 指针与内存管理

系列目录 上一篇&#xff1a;白骑士的C语言教学进阶篇 2.1 数组与字符串 在本节中&#xff0c;我们将深入探讨C语言中的指针与内存管理&#xff0c;包括指针的基础知识、指针与数组的关系&#xff0c;以及动态内存分配。指针是C语言中强大而灵活的工具&#xff0c;正确理解和使…

英语学习交流小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;每日打卡管理&#xff0c;备忘录管理&#xff0c;学习计划管理&#xff0c;学习资源管理&#xff0c;论坛交流 微信端账号功能包括&#xff1a;系统首页&#xff0c;学习资源&…

C++基础(八):类和对象 (下)

经过前面的学习&#xff0c;我们已经翻过了两座大山&#xff0c;类和对象入门知识就剩下这一讲了&#xff0c;加油吧&#xff0c;少年&#xff01; 目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表&#xff08;理解&#xff09; 1.3 explicit关键字&#xff08;C…

【Java探索之旅】继承概念_语法_父类的成员访问

文章目录 &#x1f4d1;前言一、继承1.1 继承的概念1.2 继承语法1.3 继承发生后 二、父类的访问2.1 父类成员变量访问2.2 父类成员方法访问 &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它允许我们创建一个类&…

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…

Gitblit的基本操作和技巧

Gitblit是一个开源的、轻量级的Git服务器&#xff0c;使用Java编写&#xff0c;能够提供简单的Web界面来浏览Git仓库、管理用户和仓库权限&#xff0c;以及进行一些基本的Git操作。 安装时最重要的是配置gitblit.properties文件以自定义Gitblit的行为&#xff0c;例如更改端口…

(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析

目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表&#xff08;或元组&#xff09;创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…

探索Vue.js:构建高效前端应用的现代框架

前言 在前端开发的广阔天地中&#xff0c;Vue.js以其轻量级、易上手和强大的生态系统迅速崛起&#xff0c;成为众多开发者的首选框架之一。无论是构建小型个人项目还是大型企业级应用&#xff0c;Vue.js都能提供灵活且高效的解决方案。本文将带你深入了解Vue.js的核心概念、优…

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…