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

news/2025/1/3 5:36:10/

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

相关文章

java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0

java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0 环境介绍词法规则与类方法的对应关系ClassOrInterfaceModifierContext与词法对应关系参考 环境介绍 java.g4ideawindows10 词法规则与类方法的对应关系 随便找一个词法规则,如ClassOrInterfaceModifier&am…

linux--防火墙

linux防火墙 ubuntu 1, 关于ufw 查看防火墙: sudo ufw status 关闭防火墙: sudo ufw disable 开启: sudo ufw enable 2,firewalld 执行: systemctl status firewalld 出现: Unit fi…

RTC、ADC

RTC RTC(Real-Time Clock)是实时时钟模块,用于跟踪实际时间(年、月、日、时、分、秒),即使在系统断电或处于低功耗模式下也能保持时间的准确性。 特点 时间和日期跟踪低功耗模式支持可编程闹钟和定时器备…

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作。以下是几种方法: ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**: - 在 VS Cod…

Android Glide:让图片加载从未如此简单

在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…

Quartz框架介绍

一、何为Quartz Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组…

collocate join,bucket join,broadcast join,shuffle join对比分析

在分布式计算和大数据处理中,尤其是在使用像 Apache Spark、Hive 等大数据处理框架时,Join 操作是非常常见的。根据数据分布方式和执行机制,Join 操作可以分为不同的类型,如 Collocate Join、Bucket Join、Broadcast Join 和 Shuffle Join。以下是它们的详细对比分析: 1.…

【鸿蒙 HarmonyOS NEXT】popup弹窗

一、背景 给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。 常见场景:点击按钮弹出popup弹窗,并对弹窗的内容进行交互逻辑处理,如:弹窗内点击跳转到其他页面 二、给组件绑定Popup弹窗 PopupOp…