SQL:统计每5min在线人数思路
需求如下:
目前有表:
用户开始游戏时间和游戏结束时间
如:
用户id | 游戏开始时间 | 游戏结束时间 |
000001 | 2022-06-01 00:36:33 | 2022-06-01 00:54:08 |
需要得到的数据:
时间 | 时刻 | 在线人数 |
2022-06-01 | 00:00:00 | 20 |
2022-06-01 | 00:05:00 | 22 |
2022-06-01 | 00:10:00 | 24 |
...... | ||
2022-06-30 | 00:55:00 | 20 |
每天每个小时有12条记录
思路:
可以看到 开始时间和结束时间判断对应的时间点是否在线的规则是不一样的。
判断游戏时长大于1h的为异常数据,已经过滤了游戏耗时大于1h的数据,所以目前数据的情况是
1,游戏开始时间和结束时间是在同一天,同一个小时内;
2,游戏开始时间和结束时间是同一天,不同小时内;
3,游戏开始时间和结束时间不是同一天,不同小时内;
故将以上三种情况做分析:
情况1:游戏开始时间和结束时间是在同一天,同一个小时内,则只需要膨胀游戏的开始时间得到相对应的时间点,再判断,这个点是否在开始时间和结束时间的区间内
情况2和情况3是一样的:游戏的开始时间和结束时间都需要分别去做膨胀,然后再去判断这个点是否在开始时间和结束时间的区间内 ,膨胀后的数据union all
最后把 以上两个 情况得到的结果 union all
SQL编写:
根据这两种情况去做写sql
从上思路中发现,我们需要先创建一个一小时12个点的表:
00:00,00:05,00:10,00:15,00:20,00:25,00:30,00:35,00:40,00:45,00:50,00:55
可以从现有的这个表去创造
用floor()函数去判断,当前这个分钟属于哪个点 如 04分
floor(4/5)=0 ,floor(6/5)=1,floor(12/5)=2... 以此类推可以得到上面的点
create table time_table as
select hour
, case
when level = '0' then '00:00'
when level = '1' then '05:00'
when level = '2' then '10:00'
when level = '3' then '15:00'
when level = '4' then '20:00'
when level = '5' then '25:00'
when level = '6' then '30:00'
when level = '7' then '35:00'
when level = '8' then '40:00'
when level = '9' then '45:00'
when level = '10' then '50:00'
when level = '11' then '55:00'
end as min
from
(
select
substr(start_time,12,2) as hour
,floor(substr(start_time,15,2) / 5 ) as level
from table_a
where dayno>=20220601
and dayno<=20220630
group by 1,2
) t1
得到时间表之后,和源表关联
第一种情况
只需要关联开始时间的hour就可以,因为开始和结束时间都是同一个hour下,这样关联每一条记录会膨胀12条数据
t1 join t2
on t1.hour = substr(t2.start_time,12,2)
聚合条件为
sum(case when unix_timestamp(point) - unix_timestamp(start_time) >= 0 and unix_timestamp(point) - unix_timestamp(over_time) <= 0 then 1 else 0 end) as online_user
第二种情况
需要分成两段(开始时间一段,结束时间一段),然后再把两段union all起来
开始时间的关联
t1 join t2
on t1.hour = substr(t2.start_time,12,2)
聚合条件为
sum(case when unix_timestamp(point) - unix_timestamp(start_time) >= 0 then 1 else 0 end) as online_user
结束时间的关联:
t1 join t2
on t1.hour = substr(t2.over_time,12,2)
聚合条件为
sum(case when unix_timestamp(over_time) - unix_timestamp(point) >= 0 then 1 else 0 end) as online_user
SQL:统计每5min在线人数思路相关推荐
- SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数)
SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数) 内容目录 SQL解决最多同时在线人数问题(同时视频观看人数,同时浏览人数,同时等车人数) 一.要解决的问题 二.如何解决 ...
- sql 统计常用的sql
统计常用的sql语句: 今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * fr ...
- 用sql统计vintage,滚动率,迁移率,逾期率
获取代码请移步:用sql统计vintage,滚动率,迁移率,逾期率
- mysql count if语句_COUNT分组条件去重的sql统计语句示例(mysql)
常规情况下的sql分组统计为: select count(1) from 表 where 条件 group by 字段; 但是有时往往需要添加不同的条件已经去重的统计以上语句就不能满足需求. 解决方案 ...
- 【每日一练:SQL】写一条SQL统计连续三个月金额大于0及每个月的金额
写一条SQL统计连续在三个月金额大于0及展现每个月的金额 需求: 下面是表FEE,字段是month(月份),service_id(电话号码),fee(出帐金额),请参看下面要求: Month ...
- 如何统计网站的在线人数呢?
如何统计网站的在线人数呢? 首先很简单的思想就是,如果只针对会员用户进行统计,在登录登出时加判断,然后维护一个表(或者其他存储方式)来存储在线会员即可. 但是有个问题就是,对于正常退出的会员当然可以使 ...
- 12-监听器实现统计网站当前在线人数
在 javaweb 项目中,利用监听器,实现统计网站当前在线人数 1.新建一个实现 HttpSessionListener 接口的实现类 OnlineCountListener.java packag ...
- 【sql 统计实例】统计本月,本年,去年
sql 统计 优化 分三条sql查出三种不同的状态的记录数(总记录,未支付,已支付) group by对记录数进行分日期进行统计 CASE WHEM 整合成一条sql case when ...
- mysql+下周,sql统计本周,本月,下周,下月sql语句
//本款sql 语句可以查询,本周,本月,下周,下月生日的相关数据 sql 统计本周,本月,下周,下月sql语句 /* 表结构 Student(S#,Sname,Sage,Ssex) --S# 学生编 ...
最新文章
- cheat engine lua
- 调用dubbo接口出现多次
- 【技术综述】人脸风格化核心技术与数据集总结
- objective-c java_程序员转型指南 当Java遇见了Objective-C
- JavaScript的数组常用方法
- JAVA a --; 与 -- a;
- UiAutomator控件获取
- 当systeminfo不能显示系统启动时间了--用命令行修复一下
- Python 手把手实现远程控制桌面
- 软件测试面试-在工作中功能,接口,性能,自动化的占比是多少?
- 算法设计与分析(屈婉玲)pdf
- 阿里云ACA课程之阿里云简介
- python下载动作电影_Python爬虫实战之取电影天堂,,新手练手项目
- 数据库定时备份linux篇
- Service Mesh-Conduit概览
- uniapp跨域设置
- C++数字三角形问题(动态规划)
- unity 模拟抛物线
- Android Binder设计与实现 - 设计篇
- Appium报错解决
热门文章
- UI设计趋势中的新拟物化图标设计素材模板
- ApacheCN JavaScript 译文集 20211122 更新
- 第9章 Quartz定时器和发送Email
- 手机软件android_sync,SMBSync2安卓手机SMB同步软件使用方法
- 概念:COW与MOR
- mysql sql 当前日期拼接某个时间段的写法
- Angular随记:Angular CLI安装及使用
- CRISP-DM(跨行业数据挖掘标准流程…
- Smith Chart - for myself
- 工作流任务调度系统--DolphinSchedule-1.3.6 window 安装配置