SQL实战5——统计活跃间隔对用户分级结果

2023-11-15

现有用户行为日志表tb_user_log

问题:统计活跃间隔对用户分级后,各活跃等级用户占比,结果保留两位小数,且按占比降序排序。

  • 用户等级标准简化为:忠实用户(近7天活跃过且非新晋用户)、新晋用户(近7天新增)、沉睡用户(近7天未活跃但更早前活跃过)、流失用户(近30天未活跃但更早前活跃过)。
  • 假设就是数据中所有日期的最大值。
  • 近7天表示包含当天T的近7天,即闭区间[T-6, T]。

问题分解:

  • 计算每个用户最早最晚活跃日期(作为子表t_uid_first_last):

    • 按用户ID分组:GROUP BY uid
    • 统计最早活跃:MIN(DATE(in_time)) as first_dt
    • 统计最晚活跃:MAX(DATE(out_time)) as last_dt
  • 计算当前日期和总用户数(作为子表t_overall_info):

    • 获取当前日期:MAX(DATE(out_time)) as cur_dt
    • 统计总用户数:COUNT(DISTINCT uid) as user_cnt
  • 左连接两表,即将全表统计信息追加到每一行上:t_uid_first_last LEFT JOIN t_overall_info ON 1

  • 计算最早最晚活跃离当前天数差(作为子表t_user_info):

    • 最早活跃距今天数:TIMESTAMPDIFF(DAY,first_dt,cur_dt) as first_dt_diff
    • 最晚(最近)活跃距今天数:TIMESTAMPDIFF(DAY,last_dt,cur_dt) as last_dt_diff
  • 计算每个用户的活跃等级:

    1

    2

    3

    4

    5

    6

    CASE

        WHEN last_dt_diff >= 30 THEN "流失用户"

        WHEN last_dt_diff >= 7 THEN "沉睡用户"

        WHEN first_dt_diff < 7 THEN "新晋用户"

        ELSE "忠实用户"

    END as user_grade

  • 统计每个等级的占比:

    • 按用户等级分组:GROUP BY user_grade

    • 计算占比,总人数从子表得到,非聚合列避免语法错误加了MAX:COUNT(uid) / MAX(user_cnt) as ratio

    • 保留2位小数:ROUND(x, 2)

完整代码:

SELECT user_grade, ROUND(COUNT(uid) / MAX(user_cnt), 2) as ratio
FROM (
    SELECT uid, user_cnt,
        CASE
            WHEN last_dt_diff >= 30 THEN "流失用户"
            WHEN last_dt_diff >= 7 THEN "沉睡用户"
            WHEN first_dt_diff < 7 THEN "新晋用户"
            ELSE "忠实用户"
        END as user_grade
    FROM (
        SELECT uid, user_cnt,
            TIMESTAMPDIFF(DAY,first_dt,cur_dt) as first_dt_diff, 
            TIMESTAMPDIFF(DAY,last_dt,cur_dt) as last_dt_diff
        FROM (
            SELECT uid, MIN(DATE(in_time)) as first_dt,
                MAX(DATE(out_time)) as last_dt
            FROM tb_user_log
            GROUP BY uid
        ) as t_uid_first_last
        LEFT JOIN (
            SELECT MAX(DATE(out_time)) as cur_dt,
                COUNT(DISTINCT uid) as user_cnt
            FROM tb_user_log
        ) as t_overall_info ON 1=1
    ) as t_user_info
) as t_user_grade
GROUP BY user_grade
ORDER BY ratio DESC;

 最后附上原数据表方便大家练习:

DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid INT NOT NULL COMMENT '用户ID',
    artical_id INT NOT NULL COMMENT '视频ID',
    in_time datetime COMMENT '进入时间',
    out_time datetime COMMENT '离开时间',
    sign_in TINYINT DEFAULT 0 COMMENT '是否签到'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_user_log(uid, artical_id, in_time, out_time, sign_in) VALUES
  (109, 9001, '2021-08-31 10:00:00', '2021-08-31 10:00:09', 0),
  (109, 9002, '2021-11-04 11:00:55', '2021-11-04 11:00:59', 0),
  (108, 9001, '2021-09-01 10:00:01', '2021-09-01 10:01:50', 0),
  (108, 9001, '2021-11-03 10:00:01', '2021-11-03 10:01:50', 0),
  (104, 9001, '2021-11-02 10:00:28', '2021-11-02 10:00:50', 0),
  (104, 9003, '2021-09-03 11:00:45', '2021-09-03 11:00:55', 0),
  (105, 9003, '2021-11-03 11:00:53', '2021-11-03 11:00:59', 0),
  (102, 9001, '2021-10-30 10:00:00', '2021-10-30 10:00:09', 0),
  (103, 9001, '2021-10-21 10:00:00', '2021-10-21 10:00:09', 0),
  (101, 0, '2021-10-01 10:00:00', '2021-10-01 10:00:42', 1);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL实战5——统计活跃间隔对用户分级结果 的相关文章

随机推荐

  • 浅谈 one-stage 与 two-stage 目标检测方法

    由于目前实习及找工作的原因 博客更新的频率下降 而在面试过程中也发现 虽然论文是看过了 包括也有输出一些论文笔记 但是很多时候无法形成自己对该领域的一个概括性的认知 无法粗中有细 细中有粗 主要还是基本功不扎实 反应了自己在日常学习中的学习
  • 快速排序(qsort)

    快速排序 排序方法有很多种 选择排序 冒泡排序 归并排序 快速排序等 看名字都知道快速排序是目前公认的一种比较好的排序算法 快速排序的核心思想是二分法 在此 我以升序为例 首先 我们需要选取一个基准数temp 再通过循环比较 将比基准数小的
  • mysql安装版的下载与安装(windows)

    https blog csdn net heting717 article details 73497005 这是安装版 挺方便的
  • soft fork and hard fork

    https bitcoin stackexchange com questions 30817 what is a soft fork https blog csdn net chabuduoxiansheng1 article detai
  • 【OpenAI】《Zotero GPT

    Zotero GPT 如何调教你的GPT 此教程讲述了tag的代码构成 ZoteroGPT中tag的效果就有点像浏览器中的插件 Time Content 0 51 一个tag的基本组成 5 32 tag的工作原理 6 33 删除和新建tag
  • KVM-7、KVM 虚拟机创建的几种方式

    通过对 qemu kvm libvirt 的学习 总结三种创建虚拟机的方式 1 通过 qemu kvm 创建 2 通过 virt install 创建 3 通过 virt manager 创建 在使用这三种创建虚拟机前提是 宿主机必须支持
  • 数据可视化——seaborn(一)

    数据可视化 seaborn 二 简介 seaborn这个库是基于matplotlib并且数据结构与pandas统一的python制图库 seaborn提供了一个高级界面 它是在matplotlib上进行了更高级的API封装 因此使得制图更加
  • Python学习笔记之os.walk()函数

    我们使用os listdir 函数来列出目录下的所有文件和目录放入一个列表进行返回 但是listdir 函数不可对目录的子目录进行扫描 print os listdir 输出 boot dev home proc run sys etc r
  • 前端和后台数据交互总结

    web服务器应用程序 apache tomcat nodeJs Nginx IIS 后台语言 php java net nodeJS 数据库 Mysql SqlServer Oracle 后台mvc ssh ssm 前台mvc js jsp
  • TensorFlow索引与切片语句

    学习课程 1 Basic indexing a tf ones 1 5 5 3 创建tensor a 0 0 结果是5 3的tensor a 0 0 0 结果是1 3的tensor a 0 0 0 1 结果是一个数1 2 Numpy sty
  • python汇总zip文件,压缩包的每个文件格式一样

    汇总zip文件 压缩包的每个文件格式一模一样 from zipfile import ZipFile import pandas as pd import os 打开文件 path r C Users Administrator Deskt
  • gcc/g++ 编译器使用简介

    gcc g 编译器使用简介 原地址 http blogold chinaunix net u3 109487 showart 2153853 html GNU CC 简称gcc 是GNU项目中符合ANSI C标准的编译系统 能够编译用C C
  • WireShark简介和抓包原理及过程

    WireShark 简介 WireShark是一个网络封包分析软件 其功能是记录网络封包 并尽可能显示出最为详细的网络封包信息 WireShark使用WinPCAP作为接口 直接与网卡进行数据报文交换 通俗理解 一个记录网络封包软件 你可以
  • python怎么调用另一个py文件的变量_Python中py文件引用另一个py文件变量的方法

    最近自己初学Python 在编程是遇到一个问题就是 怎样在一个py文件中使用另一个py文件中变量 问题如下 demo1代码 import requests r requests get http www baidu com r encodi
  • 【Linux】常用指令汇总

    目录 1 文件和目录操作 2 进程管理和查询 3 压缩和解压操作 4 系统信息和管理 5 远程和下载操作 6 用户和权限管理 7 时间和日期操作 8 运行和停止程序 9 其他操作 如果这篇文章对你有所帮助 渴望获得你的一个点赞 以下示例涵盖
  • 3S基础知识:VC6.0+MapX编程总结

    一 MapX的帮助 MapX的官方帮助文档是 MapX在线帮助 个人认为 这套文档过于简单 系统性偏差 与ArcEngine的帮助文档不可比 很多MapX的开发技巧在 MapX在线帮助 中查找不到 只能在互联网上搜索 本文试图从一个程序员的
  • 1V转5V芯片,三个元件即可组成完整的稳压方案

    1V低电压要转成5V的电压 需要1V转5V的芯片 由于1V输入 所以不需要指望能输出多大的电流 压差和1V的供电电压意味着供电电流也是无法做大的了 一般1V转5V的输出电流在0MA 100mA 一般60MA应用多 1V转5V电路的BOM物料
  • [LeetCode]202. Happy Number(判断正整数是不是Happy Number)

    202 Happy Number 原题链接 Write an algorithm to determine if a number is happy A happy number is a number defined by the fol
  • java.lang.Integer线程安全吗?

    java lang Integer线程安全 因为 private final int value 不可变
  • SQL实战5——统计活跃间隔对用户分级结果

    现有用户行为日志表tb user log 问题 统计活跃间隔对用户分级后 各活跃等级用户占比 结果保留两位小数 且按占比降序排序 注 用户等级标准简化为 忠实用户 近7天活跃过且非新晋用户 新晋用户 近7天新增 沉睡用户 近7天未活跃但更早