首页 > 试题广场 >

牛客直播转换率

[编程题]牛客直播转换率
  • 热度指数:23840 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客某页面推出了数据分析系列直播课程介绍。用户可以选择报名任意一场或多场直播课。
已知课程表course_tb如下(其中course_id代表课程编号,course_name表示课程名称,course_datetime代表上课时间):
course_id course_name course_datetime
1 Python 2021-12-1 19:00-21:00
2 SQL 2021-12-2 19:00-21:00
3 R 2021-12-3 19:00-21:00
用户行为表behavior_tb如下(其中user_id表示用户编号、if_vw表示是否浏览、if_fav表示是否收藏、if_sign表示是否报名、course_id代表课程编号):
user_id if_vw if_fav if_sign course_id
100 1 1 1 1
100 1 1 1 2
100 1 1 1 3
101 1 1 1 1
101 1 1 1 2
101 1 0 0 3
102 1 1 1 1
102 1 1 1 2
102 1 1 1 3
103 1 1 0 1
103 1 0 0 2
103 1 0 0 3
104 1 1 1 1
104 1 1 1 2
104 1 1 0 3
105 1 0 0 1
106 1 0 0 1
107 1 0 0 1
107 1 1 1 2
108 1 1 1 3
请你统计每个科目的转换率(sign_rate(%),转化率=报名人数/浏览人数,结果保留两位小数)。
注:按照course_id升序排序。
course_id course_name sign_rate(%)
1 Python 50.00
2
SQL 83.33
3 R 50.00
示例1

输入

drop table if exists course_tb;
CREATE TABLE course_tb(
course_id int(10) NOT NULL, 
course_name char(10) NOT NULL,
course_datetime char(30) NOT NULL);

INSERT INTO course_tb VALUES(1, 'Python', '2021-12-1 19:00-21:00');
INSERT INTO course_tb VALUES(2, 'SQL', '2021-12-2 19:00-21:00');
INSERT INTO course_tb VALUES(3, 'R', '2021-12-3 19:00-21:00');

drop table if exists behavior_tb;
CREATE TABLE behavior_tb(
user_id int(10) NOT NULL, 
if_vw int(10) NOT NULL,
if_fav int(10) NOT NULL,
if_sign int(10) NOT NULL,
course_id int(10) NOT NULL);

INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(100, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(101, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(101, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(102, 1, 1, 1, 3);
INSERT INTO behavior_tb VALUES(103, 1, 1, 0, 1);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 2);
INSERT INTO behavior_tb VALUES(103, 1, 0, 0, 3);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 1);
INSERT INTO behavior_tb VALUES(104, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(104, 1, 1, 0, 3);
INSERT INTO behavior_tb VALUES(105, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(106, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 0, 0, 1);
INSERT INTO behavior_tb VALUES(107, 1, 1, 1, 2);
INSERT INTO behavior_tb VALUES(108, 1, 1, 1, 3);

输出

1|Python|50.00
2|SQL|83.33
3|R|50.00
select
    course_id,
    course_name,
    format(sum(if_sign)/sum(if_vw)*100,2) 'sign_rate(%)'
from(
    select
        c.course_id,
        c.course_name,
        b.user_id,
        b.if_sign,
        b.if_vw
    from
        course_tb c left join behavior_tb b
        on c.course_id = b.course_id
)t
group by
    course_id,
    course_name
order by
    course_id

发表于 2024-04-19 10:04:19 回复(0)
select a.course_id,a.course_name,round(sum(b.if_sign)/sum(b.if_fav)*100,2) as 'sign_rate'
from course_tb as a left join behavior_tb as b on a.course_id=b.course_id
group by a.course_id,a.course_name
order by a.course_id
想问问为什么我写的不对呢?
发表于 2023-09-12 13:11:20 回复(0)
select
    ct.course_id,
    course_name,
    round(temp.sign / temp.vw * 100, 2)
from
    course_tb as ct
    inner join (
        select
            course_id,
            sum(if_vw) as vw,
            sum(if_sign) as sign
        from
            behavior_tb
        group by
            course_id
    ) as temp on ct.course_id = temp.course_id




发表于 2023-09-11 15:07:08 回复(0)
# 请你统计每个科目的转换率(sign_rate(%),转化率=报名人数/浏览人数,结果保留两位小数)。
# 注:按照course_id升序排序。

select 
t1.course_id,
t2.course_name,
round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from behavior_tb t1
inner join course_tb t2 on t1.course_id = t2.course_id
group by t1.course_id,t2.course_name
order by 1;

发表于 2023-08-11 13:01:34 回复(0)
select aa.course_id,course_name,round(bm/ll*100,2)from
(
select course_id,
sum(case when if_sign='1' then 1 else 0 end)bm,
sum(case when if_vw='1' then 1 else 0 end)ll
from behavior_tb
group by course_id)aa
left join course_tb bb
on aa.course_id=bb.course_id
order by course_id

发表于 2023-08-08 14:24:25 回复(0)
SELECT DISTINCT 
course_id,
course_name,
round(sum(if_sign) OVER(PARTITION BY course_id)/sum(if_vw) OVER(PARTITION BY course_id) * 100 ,2 )as "sign_rate(%)"

FROM behavior_tb  b

left join course_tb c USING (course_id)
使用开窗函数实现分组功能,无需group by 
发表于 2023-06-19 15:29:47 回复(0)
SELECT 
	b.course_id
	,a.course_name
	,ROUND(SUM(b.if_sign) / SUM(b.if_vw) * 100 , 2 )
FROM behavior_tb b 
left JOIN course_tb a 
on a.course_id = b.course_id
GROUP BY b.course_id,a.course_name
ORDER BY b.course_id ASC
select 后面只能跟聚合条件及计算函数,所以要把【course_name】也放到group by 后面,不然就会报错

发表于 2023-05-17 10:00:17 回复(0)
select c.course_id, c.course_name, round(100*sum(if_sign)/sum(if_vw),2)
from 
behavior_tb as b join course_tb as c using(course_id)
group by c.course_id, course_name
order by c.course_id asc

发表于 2023-04-19 16:44:07 回复(0)
select
    bt.course_id,
    ct.course_name,
    round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from behavior_tb bt
left join course_tb ct
on bt.course_id = ct.course_id
group by bt.course_id,
    ct.course_name
order by bt.course_id asc

发表于 2023-03-29 14:35:52 回复(0)
select course_id,course_name,
round(sum(if_sign)/sum(if_vw)*100,2) as "sign_rate%"
from behavior_tb
left join course_tb using(course_id)
group by course_id,course_name
order by course_id

发表于 2023-01-18 23:00:42 回复(0)

【场景】:分组求和再相除、转化率:累计报名人数/累计浏览人数、only_full_group_by

【分类】:分组查询、group by course_id,course_name、any_value

分析思路

难点:

1.如何使用分组后保留course_name这一列?

一、使用group by course_id,course_name

二、使用any_value

(1)统计牛客直播转换率

注:因为是0、1表示的数,所以使用sum比count方便

  • [使用]:sum()

分组时为了把course_name保留,对其也实行分组;course_id和course_name是一一对应关系所以不影响结果。

  • [使用]:group by course_id,course_name

最终结果

select 查询结果 [课程号;课程名称;转化率]
from 从哪张表中查询数据[多表]
group by 分组条件 [课程号;课程名称]
order by 对查询结果排序 [课程号];

求解代码

方法一:

使用 group by course_id,course_name

select
    course_id,
    course_name,
    round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from course_tb
left join behavior_tb using(course_id)
group by course_id,course_name
order by course_id

方法二:

使用 any_value

select
    course_id,
    any_value(course_name),
    round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from course_tb
left join behavior_tb using(course_id)
group by course_id
order by course_id
发表于 2022-11-24 12:15:17 回复(0)
select c.course_id,c.course_name,round(100*sum(b.if_sign)/sum(b.if_vw),2) as sign_rate
from course_tb c inner join behavior_tb b
on c.course_id = b.course_id
group by c.course_id,c.course_name;

发表于 2022-10-27 16:23:11 回复(0)
关键:
1.两张表通过course_id相连
2.出现在select 中的字段都要放在group by中
select t1.course_id,t2.course_name,round(sum(if_sign)*100/sum(if_vw),2)
from behavior_tb t1 left join course_tb t2
on t1.course_id=t2.course_id
group by t1.course_id,t2.course_name
order by t1.course_id


发表于 2022-10-03 15:41:34 回复(0)
select 
b.course_id,
max(b.course_name) course_name,
round(count(if(a.if_sign = 1,a.user_id,null))/count(a.user_id)*100,2) as sign_rate
from behavior_tb as a 
inner join course_tb as b on a.course_id = b.course_id
group by b.course_id
order by b.course_id asc

发表于 2022-09-13 16:56:38 回复(0)
select
    course_id,course_name,sign_rate
from (
    select
        course_id,
        round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
    from behavior_tb
    group by course_id) a 
join course_tb using (course_id)
order by course_id

发表于 2022-08-26 23:27:20 回复(0)
SELECT A.course_id,course_name,round(sum(if_sign) / sum(if_vw)*100,2) as 'sign_rate(%)' 
FROM behavior_tb A left join course_tb B on A.course_id  = B.course_id
group by A.course_id,course_name
order by A.course_id asc

发表于 2022-08-26 09:44:14 回复(0)
select bt.course_id,
       ct.course_name,
       round(100*sum(bt.if_sign)/sum(bt.if_vw),2) as 'sign_rate(%)'
from course_tb ct
join behavior_tb bt
on ct.course_id=bt.course_id
group by ct.course_id,course_name
order by ct.course_id
列名带%的字段,重命名要加引号。group by不用course_name就会报错,这是为什么呢
发表于 2022-08-11 18:16:05 回复(0)
select course_id,course_name,
round(100*sum(if_sign)/sum(if_vw),2) 'sign_rate(%)'
from course_tb join behavior_tb using(course_id)
group by 1,2
order by 1

发表于 2022-08-10 11:34:49 回复(0)

select c.course_id,course_name,
round(100*count(distinct case when if_sign=1 then user_id else null end)
/count(distinct case when if_vw=1 then user_id else null end) ,2) as 'sign_rate(%)'
from behavior_tb b 
left join course_tb c 
on b.course_id=c.course_id
group by c.course_id,course_name
order by course_id asc 


发表于 2022-07-24 19:03:36 回复(0)
select t1.course_id,
        t1.course_name,
        round((sum(t2.if_sign) / sum(t2.if_vw))*100,2) as 'sign_rate(%)'
from course_tb t1
join behavior_tb t2
on t1.course_id = t2.course_id
group by t1.course_id,t1.course_name
order by t2.course_id;

发表于 2022-07-23 23:02:03 回复(0)
  • 二维码

    扫描二维码,关注牛客网

  • 二维码

    下载牛客APP,随时随地刷题