0

0

计算视图中字段的聚合与差值:基于 ID 序列的高效分组统计

碧海醫心

碧海醫心

发布时间:2026-02-17 22:32:01

|

516人浏览过

|

来源于php中文网

原创

计算视图中字段的聚合与差值:基于 ID 序列的高效分组统计

本文介绍如何在 mariadb 中创建高性能视图,对数值字段进行去重、频次统计,并动态计算各数值最后一次出现 id 与全局最大 id(或逻辑序号)的差值,避免低效自连接。

本文介绍如何在 mariadb 中创建高性能视图,对数值字段进行去重、频次统计,并动态计算各数值最后一次出现 id 与全局最大 id(或逻辑序号)的差值,避免低效自连接。

在构建分析型视图时,常需对基础表执行多维度聚合:既要统计某字段(如 number)的出现频次,又要结合其位置信息(如 id)推导相对偏移量。本例中,目标是生成一个三列视图:number(唯一值)、occurrences(该值出现次数)、IDdifferences(该值对应的最大 id 与全表最大 id 的差值)。

关键在于避免使用 JOIN 或子查询实现逐行对比——这类写法不仅可读性差,更会在大数据量下引发性能陡降。MariaDB 10.2+ 支持窗口函数,使我们能以简洁、声明式的方式完成此类计算。

✅ 推荐方案:使用聚合 + 窗口函数

若 id 连续且无缺失(即 id 本身代表严格递增序号),可直接使用以下语句创建视图:

妙笔工坊
妙笔工坊

妙笔工坊是一个集短剧解说,AI视频生成,口播数字人,小说推文生成的ai智能工具

下载
CREATE VIEW numbers_summary AS
SELECT 
  number,
  COUNT(*) AS occurrences,
  MAX(MAX(id)) OVER () - MAX(id) AS IDdifferences
FROM numbers
GROUP BY number
ORDER BY number;
  • COUNT(*) 统计每个 number 的出现次数;
  • MAX(id) 在 GROUP BY number 下获取该 number 对应的最大 id(即“最后一次出现的 ID”);
  • MAX(MAX(id)) OVER () 是窗口函数:先对每组取 MAX(id),再在整个结果集上取最大值(即全表最大 id),等价于 SELECT MAX(id) FROM numbers,但无需额外子查询;
  • 差值 IDdifferences = 全局最大 id − 当前 number 的最大 id,自然反映“距末尾还有多少行”。

⚠️ 注意:处理 ID 不连续的情况

若原始表存在 id 缺失(如删除过记录、非自增主键等),则 id 不再代表逻辑顺序。此时应基于实际行序计算差值,推荐用 ROW_NUMBER() 构建稠密序号:

CREATE VIEW numbers_summary_dense AS
SELECT 
  number,
  COUNT(*) AS occurrences,
  MAX(MAX(rn)) OVER () - MAX(rn) AS IDdifferences
FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn 
  FROM numbers
) t
GROUP BY number
ORDER BY number;
  • 子查询 t 为每行按 id 升序分配逻辑序号 rn(1, 2, 3, …),确保序号连续;
  • 后续逻辑与上一版本一致,仅将 id 替换为 rn,从而保证 IDdifferences 始终反映“在有序列表中距离最后一行的步数”。

? 验证与优化建议

  • 索引优化:确保 numbers(number, id) 上存在复合索引(或至少 number 和 id 分别有索引),可显著加速 GROUP BY 和 MAX() 计算;
  • 视图不可更新性:该视图含聚合与窗口函数,属于不可更新视图(UPDATE/INSERT 将报错),仅适用于只读分析场景;
  • 兼容性提示:MAX(MAX(...)) OVER () 依赖嵌套窗口函数,MariaDB ≥10.2 支持;若使用旧版本,可用标量子查询替代(但性能略低):
    (SELECT MAX(id) FROM numbers) - MAX(id) AS IDdifferences

通过合理运用 GROUP BY 与窗口函数,我们以单次扫描完成全部计算,时间复杂度为 O(n),远优于 N² 级别的自连接方案。这不仅是语法技巧,更是数据库思维从“过程式遍历”向“集合式声明”的重要跃迁。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2023.11.20

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

373

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2093

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

355

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

417

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

434

2023.10.16

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

462

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号