ClickHouse 窗口函数使用详解(一) - 若

news/2025/9/30 16:03:46/文章来源:https://www.cnblogs.com/zhanchenjin/p/19121333

ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) 详解

一句话概括

"在每个部门内部,按工资从高到低给员工编号"

逐词解析

1. ROW_NUMBER()

  • 作用:生成顺序编号

  • 特点:从1开始,连续不重复(1, 2, 3, 4...)

  • 类似功能RANK()DENSE_RANK()

2. OVER

  • 作用:定义"窗口"的范围

  • 含义:表示接下来的括号内描述如何划分数据窗口

3. PARTITION BY department

  • 作用:按部门分组

  • 含义:为每个独立的部门创建单独的编号序列

  • 效果:每个部门都从1开始重新编号

4. ORDER BY salary DESC

  • 作用:在部门内部按工资降序排列

  • 含义:工资最高的排在第1位,依次类推

实际示例

假设有员工数据:

 
 
姓名 部门 工资
张三 技术部 9000
李四 技术部 8000
王五 技术部 7500
赵六 销售部 7000
钱七 销售部 8500

执行过程分解

步骤1:按部门分区

text
技术部窗口:
张三 9000
李四 8000  
王五 7500销售部窗口:
钱七 8500
赵六 7000

步骤2:部门内部按工资降序排序

text
技术部窗口(排序后):
张三 9000  ← 第1名
李四 8000  ← 第2名  
王五 7500  ← 第3名销售部窗口(排序后):
钱七 8500  ← 第1名
赵六 7000  ← 第2名

步骤3:分配行号

text
最终结果:
张三 技术部 9000  rn=1
李四 技术部 8000  rn=2
王五 技术部 7500  rn=3
钱七 销售部 8500  rn=1
赵六 销售部 7000  rn=2

完整SQL示例

sql
SELECT name,department, salary,ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rn
FROM employees;

输出结果:

 
 
name department salary rn
张三 技术部 9000 1
李四 技术部 8000 2
王五 技术部 7500 3
钱七 销售部 8500 1
赵六 销售部 7000 2

在数据去重中的应用

原始问题

在区块链任务表中,每个 (start_block, end_block) 有多个版本,需要取最新版本。

解决方案

sql
SELECT * FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY start_block, end_block ORDER BY created_at DESC) as rnFROM block_tasks WHERE status = 'init'
) WHERE rn = 1;

解读

  • PARTITION BY start_block, end_block:为每个唯一的区块范围创建独立窗口

  • ORDER BY created_at DESC:在每个窗口内,按创建时间降序排列(最新的在前)

  • rn = 1:只取每个窗口的第1条记录(即最新记录)

与其他排名函数的区别

sql
-- 数据示例:工资有相同的情况
技术部:9000, 8000, 8000, 7500-- ROW_NUMBER(): 连续唯一编号
9000 → 1
8000 → 2  
8000 → 3  ← 相同工资也分配不同编号
7500 → 4-- RANK(): 排名,相同值并列
9000 → 1
8000 → 2  ← 并列第2名
8000 → 2  ← 并列第2名  
7500 → 4  ← 跳过第3名-- DENSE_RANK(): 密集排名,无间隔
9000 → 1
8000 → 2  ← 并列第2名
8000 → 2  ← 并列第2名
7500 → 3  ← 不跳过名次

实际应用场景

场景1:获取每个部门工资最高的员工

sql
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rnFROM employees
) WHERE rn = 1;

场景2:分页查询(按部门分组分页)

sql
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY id) as rnFROM employees
) WHERE rn BETWEEN 1 AND 10;  -- 每个部门的前10条

场景3:删除重复数据

sql
DELETE FROM employees 
WHERE id IN (SELECT id FROM (SELECT id, ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as rnFROM employees) WHERE rn > 1  -- 保留每个email的第一条,删除重复
);

总结

ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 的核心价值:

  1. 分组排序:在保持分组的同时进行排序

  2. 精确选择:可以明确选择每个分组的第N条记录

  3. 数据去重:轻松实现"保留每个分组最新/最大的一条"

  4. 分页支持:支持复杂的分组分页需求

这个语法组合是现代SQL中极其重要的功能,特别适合处理"分组取Top N"这类经典问题。

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

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

相关文章

学做网站容易吗源代码下载

一、文件读取 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地…

在 Vue 3 的 script setup 语法中,定义组件名称(name)

在 Vue 3 的单文件组件(SFC)中,使用 <script setup> 语法糖时,我们通常需要为组件指定一个名称(name),这在调试和递归组件中很有用。然而,由于 <script setup> 是一种编译时语法糖,它默认不提供直…

2025 年杀虫公司联系方式推荐 天津万康:靶向消杀 + 1 年质保 300 + 政企认可的虫害防控专家

行业背景随着公众健康意识提升与商业场景卫生标准升级,有害生物防制(PCO)行业迎来规范化发展新阶段。数据显示,国内餐饮、医疗、食品加工等领域因虫害问题引发的合规风险事件年均增长 12%,传统 “一次性消杀” 模…

即墨网站优化网站建设平台信息

在系统中缓存最常用的策略是&#xff1a;服务端需要同时维护DB和cache&#xff0c;并且是以DB的结果为准–Cache-Aside Pattern&#xff08;缓存分离模式、旁路缓存&#xff09; 读数据 单纯的读数据是不会产生数据不一致&#xff0c;只有并发下读和写才会存在数据不一致。 写…

2025 年最新 1688 代运营公司推荐榜单:助力企业突破电商困境,精选优质服务商阿里巴巴国际站代运营/新店起量代运营/数据分析代运营/爆款打造代运营公司推荐

在数字经济持续深化的 2025 年,1688 平台依旧是企业拓展线上销路、提升市场份额的核心阵地。但当前众多企业在 1688 店铺运营中,仍面临专业团队缺失、平台规则更迭应对不及时、流量获取与转化难、视觉营销效果不佳等…

ClickHouse 窗口函数详解:告别 GROUP BY 的局限性,实现灵活数据分析 - 若

什么是窗口函数? 窗口函数是 SQL 中一种强大的分析功能,它允许在对每一行进行计算时,能够访问到与当前行相关的多行数据。与 GROUP BY 不同,窗口函数不会将多行合并为一行,而是保留所有原始行,同时添加计算列。 …

简单WEB网站

第一步:创建项目结构 在PyCharm中创建以下目录结构 my_web_app/ ├── backend/ # Flask后端代码 ├── frontend/ # Vue前端代码 ├── venv/ # Python虚拟环境(可选) └──requirements.…

dhru商城网站建设wordpress注册logo

目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜…

2025 年窗帘杆源头厂家最新推荐榜单:包含支架 / 环 / 全自动 / 可伸缩等多类产品及配件,帮助选到品质与交期双优的优质厂家

当前家居窗饰市场中,窗帘杆产品品质参差不齐、定制能力不足、供货效率低下等问题频发,让消费者和采购商在选择时倍感困扰。众多小型厂家缺乏专业研发团队,产品款式单一,无法满足家庭、写字楼、酒店等不同场景的个性…

大庆建设网站首页优化大师官方下载

1.链表的概念 对于顺序存储的结构最大的缺点就是插入和排序的时候需要移动大量的元素&#xff0c;所以链表的出生由此而来 先上代码&#xff1a; // 链表 public class LinkedList<T extends Comparable> {// 结点类class Node {T ele; // 当前结点上的元素内容Node ne…

2025 年电动窗帘厂家推荐榜单:聚焦国内优质企业定制实力与口碑,为采购者提供最新选择参考电动窗帘系统/电机/轨道/配件/智能电动窗帘厂家推荐

当下智能家居行业蓬勃发展,电动窗帘作为提升居住与办公舒适度的关键产品,市场需求持续攀升。然而,行业乱象却给采购者带来诸多困扰:部分品牌原材料选用不规范,劣质材料导致产品稳定性差、使用寿命短;定制服务能力…

网站推广的技巧wordpress 代码压缩

1.set和map存在的意义 &#xff08;1&#xff09;set和map的底层都是二叉搜索树&#xff0c;可以达到快速排序&#xff08;当我们按照迭代器的顺序来遍历set和map&#xff0c;其实是按照中序来遍历的&#xff0c;是排过序的&#xff09;、去重、搜索的目的。 &#xff08;2&a…

淘宝首页网站怎么做手机短视频制作软件app

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 输入 共2行&#xff0c;第1行是被减数a&#xff0c;第2行是减数b(a > b)。每个大整数不超过200位&#xff0c;不会有多余的前导零。 输出 一行&#xff0c;即所求的差。 样例输入1…

网站建设公司业务望京做网站

目录频率域滤波基础频率域的其他特性频率域滤波基础知识频率域滤波步骤小结空间域和频率域滤波之间的对应关系频率域滤波基础 频率域的其他特性 频率域中的滤波过程如下&#xff1a; 首先修改傅里叶变换以在到特定目的然后计算IDFT&#xff0c;返回到空间域 # 频率域中的其…

专业微网站开发wordpress 用户登陆后跳转到首页

register_shutdown_function注册一个会在php中止时执行的函数&#xff0c;注册一个 callback &#xff0c;它会在脚本执行完成或者 exit() 后被调用。error_get_last获取最后发生的错误&#xff0c;包含type(错误类型)&#xff0c;message(错误消息)&#xff0c;file(发生错误所…

java类加载内存分析

java类加载内存分析加载内存分析 1.加载到内存(方法区(即特殊的堆)存放原始类,加载完成后会产生一个类对应java.lang.class对象代表不同的类存放到堆中,最后在栈中开始main()链接 2.链接,连接结束后静态变量默认…

Vue3 使用注意事项

1.script-setup语法糖下// 获取 emit,注意需要直接在setup范围下,放在具体方法里,可能会因作用域导致获取不到defineEmitsconst emit = defineEmits([quanping-comp]);

ClickHouse ReplacingMergeTree 去重陷阱:为什么你的 FINAL 查询无效? - 若

问题背景 在使用 ClickHouse 的 ReplacingMergeTree 引擎时,很多开发者会遇到一个困惑:明明使用了 FINAL 关键字,查询结果却仍然包含重复数据。比如这样的情况:数据库表err := db.Table(model.BlockTaskTableName)…

js中?? 和 || 的区别详解

?? 和 || 的区别详解 在 JavaScript/TypeScript 中,??(空值合并运算符)和 ||(逻辑或运算符)都用于提供默认值,但它们在处理不同值时有关键区别。 核心区别运算符 名称 触发条件 处理假值的方式?? 空值合并…

微信机器人API接口| 个人开发者必备

微信机器人API接口| 个人开发者必备 微信二次开发个人号api个人微信机器人开发api接口,微信个人号开发API在线接待更高效 在线沟通更快速、更有趣 语音回复 通过电脑端语音回复客户,提高效率 文件传输 支持文字、图片…