用户登录直播间
假设只有一天数据
userid roomid entertime outtime
1 1 2015-01-01 14:00:01 2015-01-01 15:00:00
1 2 2015-01-01 15:00:01 2015-01-01 17:00:00
1 3
2 1
求峰值 直播间峰值用户数 和时间段。
求峰值 直播间峰值用户数 和时间段。(只有一天数据,直播间不会呆超过24小时)

sql
CREATE TABLE broadcastroom(
userid varchar2(32) ,
roomid varchar2(32)
);
SELECT * FROM broadcastroom;
INSERT INTO broadcastroom VALUES ('1','1');
INSERT INTO broadcastroom VALUES ('1','2');
INSERT INTO broadcastroom VALUES ('1','3');
INSERT INTO broadcastroom VALUES ('2','1');
INSERT INTO broadcastroom VALUES ('3','1');
INSERT INTO broadcastroom VALUES ('4','2');
-- 每个房间有多少人
with tmp1 as (
select roomid
,count(distinct userid) rn
from broadcastroom
group by roomid
)
,tmp2 AS (
SELECT
roomid
,rn
,ROW_NUMBER()over(ORDER BY rn DESC ) n
-- ,rank()over(order by rn desc) n
-- 有并列第一的时候 需要用到 rank()over()
FROM tmp1
)
SELECT
roomid
,rn
FROM tmp2
WHERE n=1
思路
1 求出每个房间多少人

2 根据人数从大道小排序

选出最大的那个
例题2
用户浏览短视频的表 table1 userid videoid starttime endtime
表2 videoid videolength
表3 userid sex
求观看超过50个短视频女性, 完播率最高的TOP10 用户
--第一步 先求观看超过50个短视频的用户
sql
with tmp1 as (
select
userid
,count(distinct videoid)
from table1
group by
userid
having count(distinct videoid)>=50
)
-- 女性用户
,tmp2 as (
select
a.userid
from tmp1 a
inner join table2 b
on a.userid = b.userid
and b.sex='femin'
)
,tmp3 as (
-- 完播率排序
select
userid
,videoid
,endtime-starttime as difftime
from table1 a
inner join tmp2 b
on a.userid = b.userid
)
,tmp4 as (
select
userid
,videoid
,row_number()over(partition by userid,videoid order by difftime desc ) rn
from tmp3
)
select
userid
,videoid
from tmp4
where rn<=10
如果是关系型数据库oracle 12c版本以上的写法则为
sql
SELECT roomid
,count(DISTINCT userid) AS n
FROM broadcastroom
GROUP BY roomid
ORDER BY n DESC
FETCH FIRST 1 ROWS only -- limit 1

MYSQL 的写法
sql
SELECT roomid
,count(DISTINCT userid) AS n
FROM broadcastroom
GROUP BY roomid
ORDER BY n DESC
limit 1
sql
SELECT
roomid
,count(DISTINCT userid) AS n
,rank()over(ORDER BY count(DISTINCT userid) desc) AS rk
-- 并列以后就没有第2名了
,row_number()over(ORDER BY count(DISTINCT userid) desc) rn
-- 房间1 和房间2 都是3个人 ,都是第一名,用rownumber的时候会随机选择一个为第一名 另一个为第2名 这就是一个随机的问题
,dense_rank()over(ORDER BY count(DISTINCT userid) desc) dr
-- 不跳过并列名次的人 有第一第二第三。
FROM broadcastroom
GROUP BY
roomid

sql
WITH tmp1 AS (
SELECT
roomid
,count(DISTINCT userid) AS n
,rank()over(ORDER BY count(DISTINCT userid) desc) AS rk
-- 并列以后就没有第2名了
,row_number()over(ORDER BY count(DISTINCT userid) desc) rn
-- 房间1 和房间2 都是3个人 ,都是第一名,用rownumber的时候会随机选择一个为第一名 另一个为第2名 这就是一个随机的问题
,dense_rank()over(ORDER BY count(DISTINCT userid) desc) dr
-- 不跳过并列名次的人 有第一第二第三。
FROM broadcastroom
GROUP BY
roomid
)
SELECT roomid
,n
FROM tmp1
WHERE rk=1
