经典sql题(六)查找用户每月累积访问次数

embedded/2024/9/23 4:58:27/

使用聚合开窗查找用户每月累积访问次数,首先介绍一下使用 GROUP BY和开窗的区别

GROUP BY
  • 行数变化:使用 GROUP BY 后,原始数据会按指定列进行分组,结果中每组只保留一行,因此行数通常减少。
  • 作用:适用于需要对数据进行汇总的场景,如计算总和、平均值等。
  • 示例:如果有多个用户的访问记录,通过 GROUP BY 可以将每个用户每月的访问次数汇总为一行。
窗口函数
  • 行数变化:窗口函数在计算时不改变原始数据的行数,即每条原始记录依然保留。
  • 作用:适用于需要在保留详细数据的同时进行累积计算、排名等操作。
  • 示例:在按月汇总用户访问数据的同时,通过窗口函数增加一列显示累计访问次数,每月的详细记录依然存在。

示例数据

假设 test 表有如下数据:

user_idvisit_datevisit_count
12023-01-05 10:30:0010
12023-01-15 15:45:0020
12023-02-10 12:00:0015
22023-01-07 09:00:005
22023-02-11 14:30:0010
32023-01-20 11:00:008
32023-02-05 16:30:0012
42023-01-25 14:00:007
42023-02-15 09:15:009
52023-01-10 13:30:006
52023-02-20 16:45:0011

第一步:提取年月并计算每月访问次数

我们首先提取出每条记录的年月,并计算每个用户每月的访问次数:

sql">SELECTuser_id,DATE_FORMAT(visit_date, '%Y-%m') AS month_id,SUM(visit_count) AS visit_cnt_lm
FROMtest
GROUP BYuser_id,month_id;
结果(子查询结果)
user_idmonth_idvisit_cnt_lm
12023-0130
12023-0215
22023-015
22023-0210
32023-018
32023-0212
42023-017
42023-029
52023-016
52023-0211

第二步:计算访问次数的累计值

然后,我们使用窗口函数为每个用户计算访问次数的累计值:

sql">SELECTuser_id,month_id,visit_cnt_lm,SUM(visit_cnt_lm) OVER (PARTITION BY user_id ORDER BY month_id) AS visit_cnt_td
FROM (SELECTuser_id,DATE_FORMAT(visit_date, '%Y-%m') AS month_id,SUM(visit_count) AS visit_cnt_lmFROMtestGROUP BYuser_id,month_id
) AS t2;
结果(最终结果)
user_idmonth_idvisit_cnt_lmvisit_cnt_td
12023-013030
12023-021545
22023-0155
22023-021015
32023-0188
32023-021220
42023-0177
42023-02916
52023-0166
52023-021117

步骤

  1. 提取年月并计算访问次数

    • 查询:使用 DATE_FORMAT 提取年月,并汇总每个用户每月的访问次数。
    • 结果表:显示用户、月份及其访问次数。
  2. 计算访问次数的累计值

    • 查询:使用窗口函数计算每个用户的访问次数累计值。
    • 最终结果:展示每个用户每月的访问次数及其累计值。

解析

  • 提取年月:使用 DATE_FORMAT 方法从完整日期中提取年月。

  • 汇总访问次数:利用 SUM(visit_count) 按用户和月份分组汇总数据。

  • 计算累计值:通过窗口函数 SUM() OVER 按用户分区、按月份排序,计算每个用户的访问次数累计值。

  • SUM(visit_cnt_lm) OVER (PARTITION BY user_id ORDER BY month_id) 计算每个用户按照月份的累计访问次数。

  • PARTITION BY user_id 按用户分区,ORDER BY month_id 按月份排序。


http://www.ppmy.cn/embedded/115420.html

相关文章

Android——内部/外部存储

Android 内部存储 与宿主 App 的生命周期相同,应用卸载时,会被系统自动删除。宿主 App 可以直接访问,无需权限。其他应用无权访问。用户访问需 Root 权限。适合存储与应用直接相关,隐私性或敏感性高的数据。 主要API getDataDi…

Webshell机制绕过的个人理解总结

Webshell是指我们上传到网站的一些恶意后门程序或代码注入,这些Webshell能够使我们获得对网站的远程控制。而Webshell的核心就是那些危险函数,即系统命令执行函数和代码执行函数 常见的系统命令执行函数有system(),exec(),shell_…

无服务器计算构建人工智能管理区块链系统

图片发自简书App 图片发自简书App 本发明属于网络版权管理技术领域,特别涉及一种以交易信息作 为唯一标准发行虚拟币的区块链系统。 背景技术 数字代币如比特币、以太坊等是区块链技术的实现方式之一,目 标是取代法定货币流通,通过“挖矿”的…

【数据仓库】数据仓库层次化设计

一、基本概念 **1. RDS(RAW DATA STORES,原始数据存储)** RDS作为原始数据存储层,用于存储来自各种源头的未经处理的数据。这些数据可能来自企业内部的业务系统、外部数据源或各种传感器等。RDS确保原始数据的完整性和可访问性&…

机器学习——Bagging

Bagging: 方法:集成n个base learner模型,每个模型都对原始数据集进行有放回的随机采样获得随机数据集,然后并行训练。 回归问题:n个base模型进行预测,将得到的预测值取平均得到最终结果。 分类问题&#xf…

Pybullet 安装过程

Pybullet 安装过程(windows) 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件,直接装之前检查下,要不会报缺少某版本MVSC的error,最好的方式是直接下载visual studio,直接按默认…

探索Python轻量级数据库:TinyDB的奇妙之旅

文章目录 探索Python轻量级数据库:TinyDB的奇妙之旅背景:为何选择TinyDB?什么是TinyDB?如何安装TinyDB?简单库函数使用方法场景应用常见Bug及解决方案总结 探索Python轻量级数据库:TinyDB的奇妙之旅 背景&…

Redis五中数据类型的底层实现

String字符串 字符串是 Redis 中最基础的数据类型,可以存储整数、浮点数或字符串。 底层实现:int整数编码和SDS简单动态字符串 SDS(Simple Dynamic String简单动态字符串): Redis 并未直接使用 C 语言的 char 数组…