本文同时发表于我的个人博客http://xinyuwg.com,访问该链接以获得详细信息与更好的阅读体验。
本文为原创内容,未经允许请勿转载。
背景
这个问题一开始是一个同事问我的,能不能用SQL求某一天哪个时刻进行中的订单量最多,这个数是多少?我寻思挺有意思,就细想了一下。其实思考下可以发现,如果要求一段时间内的同时处于服务过程中的最大订单量,相当于也要知道每个时刻的数量,所以求最大和求实时是等同的。
这个问题在不同的业务场景下有不同的意义,比如一个游戏的同时在线人数,比如一个服务器的实时并发数,比如一个仓库的货物积压数量等等。
一般而言对于需要知道并发数的业务场景都会通过实时监控来完成,而不会通过sql进行离线计算。但本着深挖sql潜能的想法,如下提供一个不切实际的解法与一个真实可行的方法。
数据
假设我们的业务场景是回溯某一天的某游戏的最大同时在线人数,并有表connection_detail记录用户每一次上线和下线时间:
user_id | login_time | logout_time | dt |
---|---|---|---|
213142 | 2019-01-01 12:21:22 | 2019-01-01 13:45:21 | 20190101 |
412321 | 2019-01-01 13:35:11 | 2019-01-01 16:01:49 | 20190101 |
… | … | … | … |
解法1:(join关联)
我们先思考一个问题,假设我们实时有一个变量online_cnt记录着当前在线人数,那么什么情况下这个数会发生变化呢?聪明的你一定想到是当有用户登录或者有用户登出的时刻。说到这思路应该就清晰了,我们需要去求每一个用户登入或登出时刻的在线人数。从另一个角度,我们需要知道每当一个用户登录或登出的时刻,用多少人还在线上。
select
max(online_cnt) as max_online_cnt
from
(
select
b.`timestamp`,
count(