当前位置: 首页 > news >正文

开窗函数!

开窗函数(Window Function)是SQL中的一种高级功能,允许你在一组相关行(一个“窗口”)上执行聚合操作,而不像传统聚合函数(如SUM(), AVG(), COUNT())那样将所有匹配行合并成单个汇总行。开窗函数在处理复杂的数据分析和报告任务时特别有用,因为它能保持原始数据行的同时进行复杂的计算。以下是开窗函数的关键特性:


基本概念: 开窗函数在查询结果集上定义一个“窗口”或“视图”,这个窗口可以包含当前行、前面的行、后面的行,甚至整个结果集的一部分。函数计算时会考虑这个窗口内的数据,但结果仍然按行返回。


主要类别:
聚合函数:如SUM(), AVG(), COUNT(), MIN(), MAX(),但它们在每个窗口内计算,而不是整个结果集。
排位函数:包括RANK(), DENSE_RANK(), ROW_NUMBER(),用于确定行在窗口中的位置。
分析函数:如LEAD(), LAG(), FIRST_VALUE(), LAST_VALUE(),用于访问同一窗口内的其他行数据。


语法结构:

function_name() OVER (
       [PARTITION BY column1, column2, ...]
       [ORDER BY column3, column4, ... [ASC|DESC]]
       [ROWS BETWEEN start AND end]
   )


PARTITION BY:将结果集分割成多个分区,每个分区单独处理。
ORDER BY:在每个分区或整个窗口内定义行的顺序。
ROWS BETWEEN:进一步定义窗口的范围,比如前几行、后几行或特定范围内的行。

mysql 如果你用的版本不支持开窗函数,可以自己实现

实例:

CREATE TABLE `ranktest` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `type2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

SELECT( @i := CASE WHEN @type2 = type2 THEN @i + 1 ELSE 1 END ) AS rownum,p.*,(@type2 := type2 ) 
FROMranktest p,(SELECT@i := 0 ) AS a 
ORDER BYtype2,id DESC

 

完成了 type2 相同的作为一个 窗口进行 独立排序 。

sql 解释:
(select @i := 0 ) as a初始化变量@i为0
@type2 := type2 将当前行的 type2 字段 赋值给 @type2变量
( @i := CASE WHEN @type2 = type2 THEN @i + 1 ELSE 1 END ) AS rownum 来判断当前行的type2值是否与前一行的type2相同,从而决定@i的值是递增还是重置为1

相关文章:

  • Android实现无线连接ADB调试
  • STM32学习和实践笔记(33):待机唤醒实验
  • 操作系统 - 文件管理
  • LeetCode 算法:接雨水c++
  • 【刷题(16)】子串
  • 提莫攻击 ---- 模拟算法
  • 备战十一届大唐杯国赛预选赛
  • C# as运算符
  • Visual Studio Code使用(C++项目新建,运行)
  • 快速入门文件操作+5种例子演示
  • 前端项目如何排查是否使用第三方.ttf
  • Docker中布置Jenkins实现Android项目的自动化构建
  • Django 创建项目及应用
  • elementui中的表单,根据条件判断切换是否必填
  • [Windows] 植物大战僵尸杂交版
  • .pyc 想到的一些问题
  • 《剑指offer》分解让复杂问题更简单
  • 「译」Node.js Streams 基础
  • android 一些 utils
  • create-react-app做的留言板
  • Debian下无root权限使用Python访问Oracle
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • js写一个简单的选项卡
  • orm2 中文文档 3.1 模型属性
  • passportjs 源码分析
  • PHP面试之三:MySQL数据库
  • 创建一种深思熟虑的文化
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给新手的新浪微博 SDK 集成教程【一】
  • 记一次用 NodeJs 实现模拟登录的思路
  • 判断客户端类型,Android,iOS,PC
  • 前言-如何学习区块链
  • 如何优雅地使用 Sublime Text
  • 主流的CSS水平和垂直居中技术大全
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ‌内网穿透技术‌总结
  • !$boo在php中什么意思,php前戏
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #define,static,const,三种常量的区别
  • #include到底该写在哪
  • #Java第九次作业--输入输出流和文件操作
  • #pragma data_seg 共享数据区(转)
  • (NSDate) 时间 (time )比较
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (九)信息融合方式简介
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (四)stm32之通信协议
  • (新)网络工程师考点串讲与真题详解