MySQL 在线人数 场景分析

这篇具有很好参考价值的文章主要介绍了MySQL 在线人数 场景分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一般在直播或者游戏中经常会统计用户在线人数,主要分为求每个时刻的在线人数和求某个时刻的在线人数两种。

【场景】:某个时刻的在线人数每个时刻的在线人数

【知识点】:窗口函数时间函数、sum(tag) over (order by dt,tag desc rows between unbounded preceding and current row)、窗口函数与分组函数的区别

一、分析思路

1、在线人数如何定义?

在线人数是指在某个时间段内,某一时刻在线的用户数。

可以求每个时刻的在线人数,也可以求某个时刻的在线人数。常用的是求每个时刻的同时在线人数,所以我们以其为例进行讲解

2、求解思路

要计算每个时刻的同时在线人数,我们可以按照以下步骤进行:

  1. 将所有登录和退出记录按照时间排序,得到一个按照时间递增的登录和退出记录。如果该记录表示用户登录,将其标记为1,如果表示用户退出标记为-1
  2. 利用窗口函数按照上述顺序对标记列进行累计求和:登录时人数+1,退出时人数-1。

3、MySQL执行步骤如下:

(1)获取标记好登录和退出的记录表

#将所有用户的进入和离开记录合并一起,统一为dt,并用tag为1和-1来标记进入还是离开
(select
	a.登录日期 as dt,
	1 as tag
from 表名1 a)
union
(select
	a.退出日期 as dt,
  -1 as tag
from 表名1 a)

这样就得到标记好登录和退出的记录

(2)对标记记录累计求和

#如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,所以在窗口函数中使用sum()需要order by dt,tag desc
select
	dt,
	sum(tag) over (order by dt,tag desc rows between unbounded preceding and current row) as 同时在线人数
from 标记好登录和退出的记录表

二、实例

下面就以两个实例讲清楚某个时刻的在线人数和每个时刻的在线人数。


两种问题的区别:

问题描述 特点 使用方法
每个时刻的用户在线人数 求用户状态变动时刻的用户在线人数 先获取标记好登录和退出的记录,然后按照时间和标记排序的顺序对标记列累计求和
某个时刻的用户在线人数 限制条件(截止到某个时刻)的在线人数 先获取标记好登录和退出的记录,然后对某个时刻前的标记列求和

(1)每个时刻的在线人数

案例来自:SQL163 每篇文章同一时刻最大在看人数
问题:统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,结果按最大人数降序。
示例:用户行为日志表tb_user_log(uid:用户ID, artical_id:文章ID, in_time:进入时间, out_time:离开时间, sign_in:是否签到)

id uid artical_id in_time out_time sign_cin
1 101 9001 2021-11-01 10:00:00 2021-11-01 10:00:11 0
2 102 9001 2021-11-01 10:00:09 2021-11-01 10:00:38 0
3 103 9001 2021-11-01 10:00:28 2021-11-01 10:00:58 0
4 104 9002 2021-11-01 11:00:45 2021-11-01 11:01:11 0
5 105 9001 2021-11-01 10:00:51 2021-11-01 10:00:59 0
6 106 9002 2021-11-01 11:00:55 2021-11-01 11:01:24 0
7 107 9001 2021-11-01 10:00:01 2021-11-01 10:01:50 0

根据示例,你的查询应返回以下结果:

artical_id max_uv
9001 3
9002 2

解释:10点0分10秒时,有3个用户正在浏览文章9001;11点01分0秒时,有2个用户正在浏览文章9002。

求解代码:
with
    main as(
        #用tag标记增加还是减少
        (select
            artical_id,
            uid,
            in_time as dt,
            1 as tag
        from tb_user_log
        where artical_id != 0)
        union
        (select
            artical_id,
            uid,
            out_time as dt,
            -1 as tag
        from tb_user_log
        where artical_id != 0)
    ),
    main1 as(
        #如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,所以在窗口函数中使用sum()需要order by dt,tag desc
        select
            artical_id,
            sum(tag) over (partition by artical_id order by dt,tag desc rows between unbounded preceding and current row) as uv
        from main
    )
#统计每篇文章同一时刻最大在看人数,结果按最大人数降序 
select
    artical_id,
    max(uv) as max_uv
from main1
group by artical_id
order by max_uv desc
  • 标记好登录和退出的记录
	artical_id	uid		 					dt								tag
1		9001      101      2021-11-01 10:00:00      1	
2		9001      102      2021-11-01 10:00:09      1	
3		9001      103      2021-11-01 10:00:28      1		
4		9002      104      2021-11-01 11:00:45      1		
5		9001      105      2021-11-01 10:00:51      1		
6		9002      106      2021-11-01 11:00:55      1		
7		9001      107      2021-11-01 10:00:01      1		
8		9001      101      2021-11-01 10:00:11      -1		
9		9001      102      2021-11-01 10:00:38      -1		
10	9001      103      2021-11-01 10:00:58      -1		
11	9002      104      2021-11-01 11:01:11      -1		
12	9001      105      2021-11-01 10:00:59      -1		
13	9002      106      2021-11-01 11:01:24      -1		
14	9001      107      2021-11-01 10:01:50      -1
  • 对标记记录累计求和
		artical_id			 dt								tag
1		9001      2021-11-01 10:00:00      1	
2		9001      2021-11-01 10:00:01      2	
3		9001      2021-11-01 10:00:09      3		
4		9001      2021-11-01 10:00:11      2		
5		9001      2021-11-01 10:00:28      3		
6		9001      2021-11-01 10:00:38      2		
7		9001      2021-11-01 10:00:51      3		
8		9001      2021-11-01 10:00:58      2		
9		9001      2021-11-01 10:00:59      1		
10	9001      2021-11-01 10:01:50      0		
11	9002      2021-11-01 11:00:45      1		
12	9002      2021-11-01 11:00:55      2		
13	9002      2021-11-01 11:01:11      1		
14	9002      2021-11-01 11:01:24      0
  • 统计每篇文章同一时刻最大在看人数
artical_id	max_uv
1	9001				3
2	9002				2

(2)某个时刻的在线人数

案例来自:SQL186 牛客直播开始时各直播间在线人数
问题:请你统计直播开始时(19:00),各科目的在线人数,以上例子的输出结果为(按照course_name升序排序):

已知上课情况表attend_tb如下(其中user_id:用户编号、course_name:课程名称,course_datetime:上课时间、in_datetime:进入直播间的时间、out_datetime:离开直播间的时间):

user_id course_name course_datetime in_datetime out_datetime
100 Python 2021-12-1 19:00-21:00 2021-12-01 19:00:00 2021-12-01 19:28:00
100 Python 2021-12-1 19:00-21:00 2021-12-01 19:30:00 2021-12-01 19:53:00
101 Python 2021-12-1 19:00-21:00 2021-12-01 19:00:00 2021-12-01 20:55:00
102 Python 2021-12-1 19:00-21:00 2021-12-01 19:00:00 2021-12-01 19:05:00
104 Python 2021-12-1 19:00-21:00 2021-12-01 19:00:00 2021-12-01 20:59:00
101 SQL 2021-12-2 19:00-21:00 2021-12-02 19:05:00 2021-12-02 20:58:00
102 SQL 2021-12-2 19:00-21:00 2021-12-02 18:55:00 2021-12-02 21:00:00
104 SQL 2021-12-2 19:00-21:00 2021-12-02 18:57:00 2021-12-02 20:56:00
107 SQL 2021-12-2 19:00-21:00 2021-12-02 19:10:00 2021-12-02 19:18:00
100 R 2021-12-3 19:00-21:00 2021-12-03 19:01:00 2021-12-03 21:00:00
102 R 2021-12-3 19:00-21:00 2021-12-03 18:58:00 2021-12-03 19:05:00
108 R 2021-12-3 19:00-21:00 2021-12-03 19:01:00 2021-12-03 19:56:00

示例数据的输出结果如下

course_name online_num
Python 4
R 1
SQL 2
求解代码:
with
    main as(
        #进入为增加人数,出去为减少人数
        select
            user_id,
            course_name,
            date_format(in_datetime,'%H:%i') as dt,
            1 as tag
        from attend_tb
        union
        select
            user_id,
            course_name,
            date_format(out_datetime,'%H:%i') as dt,
            -1 as tag
        from attend_tb
    )
#统计直播开始时(19:00),各科目的在线人数
select
    course_name,
    sum(tag) as online_num
from course_tb
left join main using(course_name)
where dt <= '19:00'
group by course_name
order by course_name;
  • 标记好登录和退出的记录
device_id 	course_name    dt					tag
100         Python        19:00        1          
100         Python        19:30        1          
101         Python        19:00        1          
102         Python        19:00        1          
104         Python        19:00        1          
101         SQL           19:05        1          
102         SQL           18:55        1          
104         SQL           18:57        1          
107         SQL           19:10        1          
100         R             19:01        1          
102         R             18:58        1          
108         R             19:01        1          
100         Python        19:28        -1         
100         Python        19:53        -1         
101         Python        20:55        -1         
102         Python        19:05        -1         
104         Python        20:59        -1         
101         SQL           20:58        -1         
102         SQL           21:00        -1         
104         SQL           20:56        -1         
107         SQL           19:18        -1         
100         R             21:00        -1         
102         R             19:05        -1         
108         R             19:56        -1         
  • 对截止时间点的标记记录求和
course_name    dt					online_num
Python        19:00        4                                              
R             18:58        1               
SQL           18:55        2             
扩展:

前往查看:MySQL 窗口函数与分组函数的区别文章来源地址https://www.toymoban.com/news/detail-411718.html

到了这里,关于MySQL 在线人数 场景分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2核4g服务器能支持多少人访问?阿里云2核4g服务器在线人数

    阿里云2核4G服务器多少钱一年?2核4G配置1个月多少钱?2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年 。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2核4G服务器活动 https://t

    2024年04月23日
    浏览(41)
  • MySQL 连续记录 场景分析

    一般在统计销售情况或者签到情况中会用到连续记录,求解连续记录问题可以使用窗口函数。 【场景】: 每个用户连续登录的最大天数 、 连续登录2天及以上时间的用户及天数 【知识点】: 窗口函数 、date(登录日期) - row_number() over(partition by 用户ID order by dt) 1、连续登录如

    2023年04月17日
    浏览(27)
  • 物流RFID设备一般在哪些场景应用?

    随着现代物流行业的快速发展,传统条码技术信息量少,易脏污损毁,耐用性不高等问题很难满足物流企业多样化的需求,物流RFID设备的应用也越来越广泛。下面我们就跟大家一起来分析一下,物流RFID设备可以在哪些场景中应用。 物流RFID设备可以在哪些场景中应用 现在物

    2024年02月13日
    浏览(41)
  • [golang 流媒体在线直播系统] 1.直播的简单介绍以及借助腾讯云直播实现在线直播

    直播,应该不陌生,有电视直播、网络主播、游戏直播、体育直播、在线教育直播等等,那么要实现在线直播的话就 必须要有 “ 流媒体在线直播服务器 ”. “流媒体在线直播服务器 ”不仅可以 实现游戏、赛事、电商、媒体、教育等行业的直播, 还可以实现 农场 监控直播 、

    2024年02月10日
    浏览(29)
  • Mysql索引失效的场景分析

    前言: 日常使用Mysql做一些业务时,发现很慢,跟踪日志返现是有慢查询语句,于是使用explain查看执行计划发现是没有使用到索引,一般这些情况都不是java框架导致的,一般框架里都会根据主键或者指定的条件去做简单的查询,复杂的查询都是通过sql原生写法来实现的,这

    2023年04月20日
    浏览(35)
  • 视频监控业务平台羚通视频智能分析平台无人机统计人数算法在人数统计中的应用策略

    随着科技的飞速发展,视频监控业务平台在各个领域的应用越来越广泛。其中,羚通视频智能分析平台凭借其先进的人工智能技术,为监控视频的智能化分析和处理提供了强大的支持。在众多应用中,无人机统计人数算法在人数统计方面的表现尤为突出。本文将深入探讨视频

    2024年02月03日
    浏览(36)
  • 线上SQL超时场景分析-MySQL超时之间隙锁

    之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。 分布式事务消息表 :业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案 消息表名 :mq_messages 数据量 :3000多万 索引 :create_time 和 status status :有两个值,1 和 2, 其中99%以上的状态都

    2024年02月05日
    浏览(37)
  • MySQL8.0.31统计男女生人数及比例

     

    2024年02月15日
    浏览(24)
  • vue中created、watch、methods的区别,一般如何使用,在什么场景下使用

    在Vue中, created 、 watch 和 methods 是Vue实例中常用的三个选项。它们的作用和使用场景如下: created : 作用: created 是Vue实例生命周期钩子函数之一,在Vue实例创建完成后立即调用。在 created 钩子函数中,可以执行一些初始化逻辑、数据请求和监听事件等操作。 使用场景:一

    2024年02月11日
    浏览(35)
  • 区域入侵/区域人数统计AI边缘计算智能分析网关V4如何修改IP地址?

    智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件,硬件采用BM1684芯片,集成高性能8核ARM A53,主频高达2.3GHz,INT8峰值算力高达17.6Tops,FB32高精度算力达到2.2T,硬件内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结

    2024年01月18日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包