首页 > 试题广场 >

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

[编程题]短视频直播间晚上11-12点之间各直播间的在线人数
  • 热度指数:16879 时间限制: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)
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)
select u.room_id,r.room_name,count(distinct u.user_id) as user_count
from user_view_tb u
left join room_info_tb r on r.room_id=u.room_id
where out_time>='23:00:00' and in_time<='23:59:59'
group by u.room_id,r.room_name
order by user_count desc
在23:59:59之前进来的,和在23:00:00之后进来的
发表于 2025-10-16 10:38:32 回复(0)
select 
    u.room_id,
    room_name,
    count(distinct user_id) as user_count 
from user_view_tb u
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 user_count desc

发表于 2025-10-10 16:25:42 回复(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 u.out_time>='23:00:00'
group by u.room_id,room_name
order by user_count desc

发表于 2025-10-09 13:55:21 回复(0)
select room_id, room_name, count(distinct user_id) user_count
from user_view_tb
join room_info_tb
using(room_id)
where in_time<='23:59:59' and out_time>='23:00:00'
group by room_id,room_name
order by user_count desc;
发表于 2025-10-07 13:05:03 回复(0)
select
    room_id,
    room_name,
    count(
        distinct (
            case
                when in_time <= '24:00:00'
                and out_time >= '23:00:00'
                then user_id
            end
        )
    )
    user_count
from
    user_view_tb u
    join room_info_tb r using (room_id)
group by
    room_id,
    room_name
order by
    user_count desc;
发表于 2025-10-04 20:44:06 回复(1)
select u.room_id, room_name,
count(distinct user_id) as user_count

from user_view_tb u
left join room_info_tb r on u.room_id=r.room_id

where (hour(in_time) in ('23','24')) or (hour(out_time) in ('23','24'))

group by u.room_id, room_name
order by user_count desc
发表于 2025-09-30 19:14:36 回复(0)
就不能像lc一样给示例输出一个解释吗,天天跟着玩文字游戏
发表于 2025-09-25 02:22:17 回复(0)
select user_view_tb.room_id,room_name,count(distinct user_id) as user_count
from user_view_tb
join room_info_tb
on user_view_tb.room_id = room_info_tb.room_id
where in_time between <='24:00:00' and out_time >= '23:00:00'
group by user_view_tb.room_id,room_name
order by user_count desc
23-24点在线就说明从他进来到离开这个时间段与23-24点这个时间段有交集:所以左端点,也就是进入时间一定要在24点之前;同时也要满足右端点,也就是离开时间一定要是在23点之后;同时满足这两个条件才是有交集,才能计数。(where in_time between <='24:00:00' and out_time >= '23:00:00'
与此同时,还要注意这段时间可能有人反复进入直播间,而这种情况我们只记录一次,所以要在count中用distinct进行去重
发表于 2025-09-22 23:07:32 回复(0)
with t as (
select distinct user_id,u.room_id,room_name,out_time
from user_view_tb u
left join room_info_tb r
on u.room_id=r.room_id
where hour(out_time) between 23 and 24
)
select room_id,room_name,count(user_id) user_count
from t
group by room_id,room_name
order by room_id asc,user_count desc
发表于 2025-09-19 14:14:59 回复(0)
这题不是只需要离开时间在11点到12点之间就可以了吗,
不必严格限制进入时间吧?因为离开时间在11点和十二点之间不就行了?
SELECT
    sub.room_id,
    sub.room_name,
    sub.user_count
FROM
    (
        SELECT
            r.room_id,
            r.room_name,
            COUNT(DISTINCT u.user_id) user_count
        FROM
            user_view_tb u JOIN room_info_tb r
            ON u.room_id=r.room_id
        WHERE
            u.out_time BETWEEN '23:00:00' AND '24:00:00'
        GROUP BY
            r.room_id,
            r.room_name
    )AS sub
ORDER BY
    user_count DESC

发表于 2025-09-16 06:43:43 回复(0)
where in_time < '24:00:00' or out_time >'23:00:00' 时间需要引号
发表于 2025-09-05 11:35:32 回复(0)
select 
    t1.room_id
    ,room_name
    ,count(distinct user_id) as user_count
from user_view_tb t1 left join room_info_tb t2 on t1.room_id=t2.room_id
where out_time between '23:00:00' and '23:59:59'
group by t1.room_id,room_name
order by user_count desc
;

发表于 2025-08-29 14:30:34 回复(0)