需求分析

数据为主播ID,sdt表示开播时间,edt表示下播时间。

求:

  • (1)该平台某一天主播同时在线人数最高为多少?

  • (2)出现最高峰的时间段是哪个时间?

  • 建表

注:我用的oracle实现的

DROP TABLE "STARPOWER"."PLAY";
CREATE TABLE "STARPOWER"."PLAY" ("ID" VARCHAR2(100 BYTE),"SDT" DATE,"EDT" DATE
)
TABLESPACE "STARPOWER"
LOGGING
NOCOMPRESS
PCTFREE 10
INITRANS 1
STORAGE (INITIAL 65536 NEXT 1048576 MINEXTENTS 1MAXEXTENTS 2147483645BUFFER_POOL DEFAULT
)
PARALLEL 1
NOCACHE
DISABLE ROW MOVEMENT
;
COMMENT ON TABLE "STARPOWER"."PLAY" IS '测试表';-- ----------------------------
-- Records of PLAY
-- ----------------------------
INSERT INTO "STARPOWER"."PLAY" VALUES ('1001', TO_DATE('2021-06-14 12:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 18:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1003', TO_DATE('2021-06-14 13:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 16:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1004', TO_DATE('2021-06-14 13:15:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 20:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1002', TO_DATE('2021-06-14 15:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 16:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1005', TO_DATE('2021-06-14 15:18:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 20:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1001', TO_DATE('2021-06-14 20:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 23:12:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1006', TO_DATE('2021-06-14 21:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 23:15:12', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "STARPOWER"."PLAY" VALUES ('1007', TO_DATE('2021-06-14 22:12:12', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2021-06-14 23:10:12', 'SYYYY-MM-DD HH24:MI:SS'));

数据分析

本题如果直接从SQL本身很难下手,无从做起,不妨我们换个思路,假定我们拿到的是一条数据,现在用java程序怎么做?其实就是一个累加器的思想(如SPARK的累加器)。首先我们需要将这样一条记录进行拆分,分成不同的记录或数据流进入累加器,然后给每条记录进行标记,如果开播的话该条记录记为1,下播的话记为-1,此时的数据流按照时间顺序依次进入累加器,然后在累加器中进行叠加,其中累计的结果最大时候就是所求的结果。其实本质是利用累加器思想,但进入累加器的数据是按时间排好序的时序流数据(数据进入按时间先后顺序进入)。

上述思路总结如下:

  • (1)将数据切分(按起始时间和结束时间)

  • (2)数据进行标签,开播的记录为记为1,下播的记录记为-1用于累加

  • (2)将数据按时间进行排序

  • (3)数据进入累加器进行累加

  • (4)获取累加器中当前累加值最大的数值

有了以上思路后,我们将其转换为SQL求解思路。

SELECTmax_cur_cnt,dt AS start_time,lead_dt AS end_time
FROM(SELECTid,dt,flag,cur_cnt,max_cur_cnt,lead ( dt, 1, dt ) OVER ( ORDER BY dt ) lead_dt FROM(SELECTid,dt,flag,cur_cnt,max( cur_cnt ) OVER ( ) AS max_cur_cnt FROM(SELECTid,dt,flag,sum( flag ) OVER ( ORDER BY dt ) AS cur_cnt FROM( SELECT id, sdt dt, 1 flag FROM play UNION SELECT id, edt dt,- 1 flag FROM play ) t --开播时间和下播时间) m --按照时间排序,进入累加器进行累加(按时间排序是累加的关键)sum over) n --求出最大在线人数) p --lead函数求出在线人数最大的时间段(lead向后取N,lag向前取N)
WHERECUR_CNT = MAX_CUR_CNT

结果如下

参考:https://mp.weixin.qq.com/s/3VYbmT2h5lkTzGr7X86COQ

SQL求最高在线人数以及最高峰时间段相关推荐

  1. SQL查询最大在线人数(通用方法)

    标记进入时间为1,退出时间为-1,通过union all将两个标记好的表格合并成一张表格,通过sum()over()窗口函数,可以求出在线人数.最后通过max聚合函数,求出最大的在线人数.具体题目跟代 ...

  2. sql求31到第40条数据(id不连续)

    sql求31到第40条数据(id不连续) --利用开窗函数,并将其当作结果集 查询其31到第40条 select* from (select *,ROW_NUMBER() over(order by ...

  3. 如何用sql求平均成绩

    用sql求 平均成绩大于80的学生姓名

  4. SQL:求筛选时间段内每天各分组的聚合数据

    任务场景: 报表需求,必须由SQL处理完成,页面筛选条件为日期段,需要将所选日期按照每日区分,查出所有组别在每日的进线量.接通量.呼损量.接听率.进线占比.好评率. 进线量为线路全部进线量,接通量为s ...

  5. sql求平均日活_日活、周活(周重活)、月活 统计

    效果展示: 以上数据为测试数据 实现思路: 按照查询天数往前推规定天 比如周.月 登录表为按月分表(数据量大约一张表1000W+数据) 关键sql: laravel5.1 框架 日活实现方式一: 不使 ...

  6. 基于SQL求集合的交、并、补

    对数据库查询结果集求补(差).交.并集,可利用SQL的EXCEPT(补集).INTERSECT(交集)和UNION(并集)关键词,其中Mysql仅支持UNION,但可以利用SQL实现EXCEPT.IN ...

  7. 用户留存率是什么?如何用sql求出次日留存率?

    建表sql语句: drop table if exists liucunlv; create table liucunlv as select * from ( select 'a' as user_ ...

  8. 如何用sql求基金连涨、连跌天数

    背景:某万恶的产品经理要求计算基金的最大连涨连跌天数,但SQL具有局限性,不擅长表达相对位置,特别是计算连续.虽然可以通过窗口函数,但如下所示,逻辑较为复杂,且不易于理解,因此有必要换一种思路来实现: ...

  9. sql 求同时在线人数(或者同时观看人数/同时浏览人数)

    模拟场景 例如登陆表 解决方案 1.思路: 把登陆时间.和登出时间看成一个动作,登录就+1人,登出就-1人.然后每个时间进行累加所有的人.即可看出每个时间点的在线人数. 2.代码 1.把登录时间.登出 ...

最新文章

  1. 面试前赶紧看了5道Python Web面试题,Python面试题No17
  2. 《XNA高级编程:Xbox 360和Windows》1-1
  3. 一个理想主义者关于爱情和美女、事业与金钱的疯人痴语
  4. sql server存储过程中SELECT 与 SET 对变量赋值的区别
  5. 宁可寸寸断,不意绕指柔
  6. 汇编语言 条件转移指令JCXZ
  7. Redis的快照与AOF
  8. html制作花样链接卡页面_使用HTML5实现刮刮卡效果
  9. 解决_类百度在线留言本_所遇到的问题
  10. 服务器mysql如何添加数据库文件,如何在使用MySQL作为嵌入式服务器时创建数据库文件...
  11. 科技计划项目数据管理过程模型
  12. IE8 打开网站首页显示的却是手机网站
  13. mac 解压_BetterZip for Mac(Mac解压压缩工具)
  14. “我的开源项目被科技巨头拿去做产品了,注释中连名字都被删掉了”
  15. 实验三 函数的最值与导数
  16. Linux系统压缩解压缩
  17. 您需要计算机管理员权限,安装需要管理员权限,教您怎么设置安装软件需要管理员权限...
  18. JxBrowser 7 Crack 申请试用教程
  19. python基础语法看一篇就够了,全网最全python语法笔记汇总
  20. FPGA自学:利用D触发器实现分频

热门文章

  1. DRF中的视图集使用
  2. touch事件中的touches、targetTouches和changedTouches详解(转)
  3. 【算法分析】ABCDE*A=EEEEEE的问题
  4. java defunct怎么杀掉_杀死Linux中的defunct进程(僵尸进程)的方法指南
  5. JAVA基础学习(接收用户输入)
  6. 永磁同步电机凸极性和隐极性面装式和内置式的关系
  7. 广西举办壮语春节联欢晚会
  8. 香港服务器CN2线路双向和单向到底什么意思?
  9. 2018.3.18都江堰双遗马拉松成绩证书查询链接
  10. 从qq或微信上打开页面链接,直接跳转到360首页