首页 > 试题广场 >

短视频直播间晚上11-12点之间各直播间的在线人数

[编程题]短视频直播间晚上11-12点之间各直播间的在线人数
  • 热度指数:22383 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现有某天短视频直播间用户观看直播间的信息表user_view_tb如下,
(其中字段包含用户id:user_id、直播间id:room_id、  进入时间:in_time,离开时间:out_time)
user_id room_id in_time out_time
1 1001 10:00:00 10:30:00
2 1001 10:01:00 10:05:00
3 1001 10:05:00 10:20:00
1 1002 19:05:00 20:05:00
2 1002 19:15:00 19:55:00
2 1002 20:15:00 20:45:00
3 1002 20:15:00 20:45:00
4 1003 22:15:00 23:15:00
1 1002 23:15:00 23:45:00
4 1002 23:10:00 23:25:00
3 1002 23:00:00 23:35:00
4 1001 23:10:00 23:25:00
3 1001 23:00:00 23:35:00
4 1003 23:10:00 23:15:00
1 1001 20:10:00 20:15:00
1 1001 20:00:00 23:35:00
有直播间信息表room_info_tb如下:
room_id room_name room_type
1001 娱乐大王牌 娱乐
1002 声家班 搞笑
1003 嗨嗨嗨 搞笑
请你统计晚上11-12点之间各直播间的在线人数(包含边界值11:00、12:00),并按在线人数降序排序,以上例子输出结果如下:
room_id room_name user_count
1001 娱乐大王牌 3
1002 声家班 3
1003 嗨嗨嗨 1


示例1

输入

drop table if exists user_view_tb;
CREATE TABLE user_view_tb(
user_id int(10) NOT NULL,
room_id int(10) NOT NULL,
in_time time NOT NULL,
out_time time NOT NULL
);
INSERT INTO user_view_tb VALUES(1, 1001, '10:00:00', '10:30:00');
INSERT INTO user_view_tb VALUES(2, 1001, '10:01:00', '10:05:00');
INSERT INTO user_view_tb VALUES(3, 1001, '10:05:00', '10:20:00');
INSERT INTO user_view_tb VALUES(1, 1002, '19:05:00', '20:05:00');
INSERT INTO user_view_tb VALUES(2, 1002, '19:15:00', '19:55:00');
INSERT INTO user_view_tb VALUES(2, 1002, '20:15:00', '20:45:00');
INSERT INTO user_view_tb VALUES(3, 1002, '20:15:00', '20:45:00');
INSERT INTO user_view_tb VALUES(4, 1003, '22:15:00', '23:15:00');
INSERT INTO user_view_tb VALUES(1, 1002, '23:15:00', '23:45:00');
INSERT INTO user_view_tb VALUES(4, 1002, '23:10:00', '23:25:00');
INSERT INTO user_view_tb VALUES(3, 1002, '23:00:00', '23:35:00');
INSERT INTO user_view_tb VALUES(4, 1001, '23:10:00', '23:25:00');
INSERT INTO user_view_tb VALUES(3, 1001, '23:00:00', '23:35:00');
INSERT INTO user_view_tb VALUES(4, 1003, '23:10:00', '23:15:00');
INSERT INTO user_view_tb VALUES(1, 1001, '20:10:00', '20:15:00');
INSERT INTO user_view_tb VALUES(1, 1001, '20:00:00', '23:35:00');

drop table if exists room_info_tb;
CREATE TABLE room_info_tb(
room_id int(10) NOT NULL,
room_name varchar(20) NOT NULL,
room_type varchar(20) NOT NULL
);
INSERT INTO room_info_tb VALUES(1001, '娱乐大王牌', '娱乐');
INSERT INTO room_info_tb VALUES(1002, '声家班', '搞笑');
INSERT INTO room_info_tb VALUES(1003, '嗨嗨嗨', '搞笑');

输出

1001|娱乐大王牌|3
1002|声家班|3
1003|嗨嗨嗨|1
我觉得很多答案都有问题,因为有些人会在23点以前进入,但是23-24中间退出,有些人会在23-24之间进入,但是不会退出,还有一些人会很早就进入,但是一直不退出。
select
    r.room_id,
    room_name,
    count(distinct (u.user_id)) as user_count
from
    user_view_tb u
    left join room_info_tb r on u.room_id = r.room_id
where
    (u.in_time between "23:00:00" and "24:00:00")
         or (u.out_time between "23:00:00" and "24:00:00")
         or (u.in_time <"23:00:00" and u.out_time >"24:00:00")
group by
    r.room_id,
    room_name
order by
    user_count desc



发表于 2025-04-02 10:32:04 回复(6)
SELECT 
    r.room_id,
    r.room_name,
    COUNT(DISTINCT user_id) AS user_count
FROM user_view_tb u
JOIN room_info_tb r USING(room_id)
WHERE u.in_time <= '23:59:59' AND u.out_time >= '23:00:00'
GROUP BY r.room_id,r.room_name
ORDER BY user_count DESC

发表于 2024-12-25 09:55:37 回复(2)
select room_id, room_name, count(distinct user_id) as user_count
from user_view_tb 
left outer join room_info_tb using(room_id)
where out_time between time('23:00:00') and time('24:00:00')
group by room_id, room_name
order by count(distinct user_id) desc


发表于 2025-02-24 16:25:58 回复(0)
思路:
1、各直播间,说明需要在每个不同的直播间内统计在线人数,需要使用group by直播间
2、时间段为23:00-23:59:59,在线就需要在线时间段与23:00-23:59:59存在交集。满足进入时间小于结束时间且退出时间大于开始时间即为交集,因为进入时间大于结束时间或者退出时间小于结束时间,一定不存在交集。可以直接用时间字符串进行比较操作符判断时间大小,时间字符串会被识别为时间类型
select
    room_id,
    room_name,
    user_count
from(
    select
        rit.room_id,
        rit.room_name,
        #注意,左连接的逻辑是一段在线时间就匹配一次,所以一行实际上是一段在线时间
        #但是还需要考虑同一个用户同一直播间进进出出多次的情况
        count(distinct uvt.user_id)as user_count
    from room_info_tb rit
    left join user_view_tb uvt
        on rit.room_id=uvt.room_id
    where uvt.out_time>='23:00:00'
        and uvt.in_time<'24:00:00'
    group by rit.room_id,rit.room_name
)temp
order by user_count desc,room_id asc


发表于 2025-06-22 09:40:54 回复(0)
with t1 as (
    select distinct user_id, room_id
    from user_view_tb
    where out_time <='24:00:00' and out_time>='23:00:00'
)
,
t2 as(
    select t1.room_id, count(distinct t1.user_id) as user_count
    from t1 
    group by t1.room_id
)

select  t2.room_id, rit.room_name, t2.user_count
from t2 
join room_info_tb rit 
on t2.room_id=rit.room_id
order by t2.user_count desc

发表于 2024-07-26 20:53:20 回复(0)
with t1 as (
    select u.*,
    r.room_name
    from user_view_tb u
    left join room_info_tb r
    on u.room_id = r.room_id
    where (in_time between '23:00:00' and '24:00:00')
    or (out_time between '23:00:00' and '24:00:00')
    or (in_time < '23:00:00' and out_time > '24:00:00')
)

select room_id, room_name,
count(distinct user_id) as user_count
from t1
group by room_id, room_name
order by user_count desc
发表于 2026-01-30 15:15:30 回复(0)
select room_id,room_name,count(*)as user_count
from(
select distinct u.user_id,u.room_id,r.room_name
from user_view_tb u 
left join room_info_tb r on u.room_id=r.room_id 
where in_time<='24:00:00' and out_time>='23:00:00'
)t 
group by room_id,room_name
order by user_count desc,room_id

发表于 2026-01-29 09:49:14 回复(0)
with t1 as (select distinct user_id,t1.room_id,room_name
from user_view_tb t1
left join room_info_tb t2 on t1.room_id=t2.room_id
where in_time>'10:00:00' and out_time between '23:00:00' and '24:00:00')
select room_id,room_name,count(*) as user_count
from t1
group by room_id,room_name
order by user_count desc,room_id
发表于 2026-01-20 18:36:13 回复(0)
select u.room_id, room_name,count(distinct user_id) user_count
from user_view_tb u left join room_info_tb r on u.room_id=r.room_id
where in_time<'24:00:00' and out_time>='23:00:00'
group by u.room_id, room_name
order by u.room_id,count(distinct user_id) desc
发表于 2026-01-16 16:58:34 回复(0)
select
    room_id,
    room_name,
    count(1)
from
(
select distinct
    u.user_id,
    u.room_id,
    r.room_name
from  user_view_tb as u
join room_info_tb as r
on u.room_id=r.room_id
where out_time>='23:00:00' and out_time<='24:00:00'
) as a
group by room_id,room_name
发表于 2026-01-11 22:13:09 回复(0)
select t1.room_id,room_name,user_count from (
select u.room_id, count(distinct user_id)  user_count
from user_view_tb u  
where in_time between '23:00:00' and '24:00:00'  or out_time between '23:00:00' and '24:00:00'
group by u.room_id ) t1 join room_info_tb r on t1.room_id = r.room_id
order by user_count desc
发表于 2026-01-08 15:43:53 回复(0)
SELECT u.room_id,room_name,count(distinct user_id) user_count
FROM user_view_tb u
INNER JOIN room_info_tb r ON r.room_id = u.room_id
WHERE hour(in_time) <= 23 AND hour(out_time) = 23
GROUP BY room_id,room_name
ORDER BY user_count desc

发表于 2025-12-30 16:37:57 回复(0)
select r.room_id,
    r.room_name,
    count(distinct u.user_id) as user_count #去重:可能有相同用户进入同一个直播间多次
from user_view_tb u
    join room_info_tb r on r.room_id = u.room_id
where u.in_time <= '24:00:00' and u.out_time >= '23:00:00'
group by r.room_id,r.room_name
order by user_count desc
发表于 2025-12-14 14:37:32 回复(0)
关键点:
1.11点至12点的在线用户筛选利用进入时间要小于当天的24时,出去时间要大于23点这样可以筛选出你23-24点在线的用户!
2.有可能具有同一用户在23-24点内一个小时多次进入同一个直播间但是只能算一个人
故需要筛选出在线的独立用户数即用户id和房号id相同的需要distinct
发表于 2025-12-13 13:55:23 回复(0)
with night as (select *
from user_view_tb
where time(out_time) > "23:00:00" and time(out_time) < "24:00:00")

select a.room_id, a.room_name,count(distinct(user_id)) as user_count
from room_info_tb a join night b on a.room_id = b.room_id
group by a.room_id,a.room_name
order by user_count desc
发表于 2025-12-03 01:35:40 回复(0)
这题的要点就是对时间段的圈定,要求23点-24点间的直播观看人次,那只要是23点后登出,以及24点前登入的人都算
select u.room_id
    ,r.room_name
    ,count(distinct u.user_id) user_count
from user_view_tb u
join room_info_tb r on r.room_id=u.room_id
where u.in_time < '23:59:59' 
   and u.out_time >='23:00:00' 
group by u.room_id,r.room_name
order by user_count desc

发表于 2025-11-21 14:23:51 回复(0)
select ut.room_id,rt.room_name, count(distinct ut.user_id) as user_count
from user_view_tb ut join room_info_tb rt on ut.room_id=rt.room_id
where  (
    -- 23点前进入,且离开时间 >=23:00(不管何时离开)
    (TIME(ut.in_time) < '23:00:00' AND TIME(ut.out_time) >= '23:00:00')
    OR
    -- 23-00点进入(不管何时离开,只要进入在目标时段)
    (TIME(ut.in_time) >= '23:00:00' OR TIME(ut.in_time) <= '00:00:00')
  )
group by ut.room_id,rt.room_name
order by user_count desc
发表于 2025-11-17 10:43:56 回复(0)
select
    u.room_id,
    room_name,
    count(distinct user_id) user_count
from
    user_view_tb u
    join room_info_tb r on u.room_id = r.room_id
where
    (in_time BETWEEN "23:00:00" and "24:00:00")
    or (out_time BETWEEN "23:00:00" and "24:00:00")
group by
    u.room_id,room_name
order by
    user_count desc

我总是忘记groupby中加入非聚合列,导致数据库已经运行出结果,但是这里运行不通过,下次注意这个问题!
发表于 2025-10-31 09:19:47 回复(0)
select u.room_id ,room_name, count(distinct user_id) user_count  from user_view_tb u left join room_info_tb r on u.room_id=r.room_id where hour(in_time) between 23 and 24 or hour(out_time) between 23 and 24 group by u.room_id,room_name order by user_count desc ,room_id asc ;
发表于 2025-10-21 21:56:59 回复(0)
select room_id,room_name,count(distinct user_id) as user_count
from
(select y.room_id,y.room_name,user_id,in_time,out_time
from user_view_tb x
join room_info_tb y
using(room_id)
where in_time between "23:00:00" and "24:00:00"
or out_time between "23:00:00" and "24:00:00"
order by 1) e
group by 1,2
order by 3 desc

发表于 2025-10-16 17:34:17 回复(0)