首页 > 试题广场 >

牛客直播转换率

[编程题]牛客直播转换率
  • 热度指数:23056 时间限制: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 b.course_id,  b.course_name, 
round((a.count1/a.count2)*100,2) as 'sign_rate(%)' from 
(select distinct course_id, sum(if_sign) over (partition by course_id) 
 as count1,
 sum(if_vw) over (partition by course_id) 
 as count2
from behavior_tb) a
join course_tb b on a.course_id=b.course_id
order by b.course_id

发表于 2022-03-15 17:05:56 回复(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 ;
为什么GROUP BY 这里不加个‘courseid’就通过不了?
发表于 2022-01-26 14:25:42 回复(4)
select a.course_id,c.course_name,a.rate
from course_tb c inner join
(select 
course_id,
round((sum(if_sign)/(sum(if_vw)))*100,2) rate
from  behavior_tb
group by course_id) as a on a.course_id=c.course_id
order by a.course_id
上述方法先操作了behavior_tb,利用course_id进行了一个聚合,然后联结表course_tb,得出最终结果。一开始也想要直接联结两个表,因为考虑到course_tb里面course_id和course_name是一一对应的关系,就直接group by course_id出结果,但是报错,但是后来看小伙伴们的答案,知道啦要group by course_id,course_name,这才清楚,想想之前做的例子,确实是这样,理解了,以后要求:
select column1,column2,column3,sum(column4) from table_name
group by column1,column2,column3
下面是精简之后的结果
select c.course_id,c.course_name,
round((sum(b.if_sign)/(sum(b.if_vw)))*100,2) rate
from course_tb c inner join behavior_tb b on b.course_id=c.course_id
group by c.course_id,c.course_name
order by c.course_id
自己的基础还不是很牢固,还是要加强对基础知识的理解和应用!

发表于 2021-12-04 11:34:35 回复(3)

【场景】:分组求和再相除、转化率:累计报名人数/累计浏览人数、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 t1.course_id,t1.course_name,
concat(round(sum(if_sign)/sum(if_vw),2)*100,'%') as sign_rate
from course_tb t1 left join behavior_tb t2
on t1.course_id = t2.course_id
group by t1.course_id
order by t1.course_id
这种写法在牛客的编程环境中会报错,但是用Navicat来运行是可以得出正确结果的
发表于 2022-02-25 20:20:37 回复(2)
我感觉 不对,转化率 如果按照你们说的把 包名的全部加起来,那不就重复了吗 表里面有重复的啊

发表于 2024-02-24 16:06:30 回复(0)
select 
    course_id
    ,course_name
    ,round(100 *sum(if_sign)/sum(if_vw),2) as sign_rate
from behavior_tb join course_tb
using(course_id)
group by course_id,course_name
order by course_id

发表于 2023-11-29 21:13:33 回复(0)
select a.course_id,
course_name,
round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from course_tb a
inner join  behavior_tb b 
using(course_id)
group by a.course_id,course_name
order by a.course_id 

发表于 2023-11-21 11:43:33 回复(0)
select course_id,course_name,
round(
count(distinct if(if_sign=1,user_id,null))/count(distinct user_id)*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-10-09 10:45:18 回复(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)
select c.course_id, course_name, r as 'sign_rate(%)'
from course_tb c inner join 
(select course_id, round(100*sum(if_sign)/sum(if_vw),2) as r from behavior_tb group by course_id) b
on c.course_id=b.course_id 
order by course_id;

发表于 2023-08-24 17:27:20 回复(0)
select bt.course_id, ct.course_name, round((sum(if_sign)/sum(if_vw))*100,2) as 'sign_rate(%)'
from behavior_tb as bt
inner join course_tb as ct
using(course_id)
group by bt.course_id, ct.course_name
order by bt.course_id asc
打卡学习了select中除了聚合函数的列,其它列都应该出现在group by中
或者加上any_value()
发表于 2023-08-15 08:40:16 回复(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
	course_id,
	any_value(course_name) course_name,
	any_value(ROUND(SUM(if_sign)/SUM(if_vw)*100,2)) 'sign_rate(%)'
FROM
	course_tb
	LEFT JOIN behavior_tb USING (course_id)
GROUP BY course_id
ORDER BY course_id;

发表于 2023-08-10 16:26:14 回复(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)
想问一下联结表的情况下,groupby是需要两个条件吗
发表于 2023-07-28 16:28:41 回复(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
    bt.course_id,
    ct.course_name,
    ROUND( 100 * SUM( if_sign )/ SUM( if_vw ), 2 ) '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
发表于 2023-06-09 21:43:37 回复(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)
  • 二维码

    扫描二维码,关注牛客网

  • 二维码

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