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

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

使用聚合开窗查找用户每月累积访问次数,首先介绍一下使用 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

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

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

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

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

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

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 按月份排序。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Hot100】LeetCode—84. 柱状图中最大的矩形
  • Rust表达一下中秋祝福,群发问候!
  • 【优化器】Optimizer——深度学习中的优化器是什么作用呢?
  • claude,gpt,通义千问
  • 5. Python之数据类型
  • MATLAB窗口操作常用命令
  • 基于 Delphi 的家庭财务管理系统
  • Linux-mysql5.7-mysql8.0安装包下载及安装教程,二合一
  • 车型展示+接驳体验!苏州金龙海格客车闪耀汉诺威商用车展
  • Android 系统下:普通应用无缝安装,Launcher 应用安装遭遇罕见障碍解析
  • 使用 Java 初步搭建简单Spring 项目框架:
  • Docker和K8S
  • 车辆重识别(关于卷积神经网络一些资料)2024/9/11
  • 【454. 四数相加 II】
  • 【设计模式-外观】
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Android系统模拟器绘制实现概述
  • ComponentOne 2017 V2版本正式发布
  • CSS盒模型深入
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • log4j2输出到kafka
  • Redis字符串类型内部编码剖析
  • supervisor 永不挂掉的进程 安装以及使用
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 诡异!React stopPropagation失灵
  • 聊聊sentinel的DegradeSlot
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 译有关态射的一切
  • 2017年360最后一道编程题
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​插件化DPI在商用WIFI中的价值
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SpringBoot)第二章:Spring创建和使用
  • (层次遍历)104. 二叉树的最大深度
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (接口封装)
  • (实战篇)如何缓存数据
  • (四)汇编语言——简单程序
  • (算法)前K大的和
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 8.0 新的变化
  • .net core Swagger 过滤部分Api
  • .NET Micro Framework初体验
  • .net refrector
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件