首页 > 试题广场 >

请写出计算粉丝ctr的sql语句

[编程题]请写出计算粉丝ctr的sql语句
  • 热度指数:15638 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现有下列三张表,创作者和粉丝关系表a,创作者和内容关系表b,粉丝在内容上的行为明细表c,现在想统计出所有粉丝CTR,请写出对应的SQL语句。
注:CTR为点击率,等于“作者对应的粉丝总阅读次数/作者对应的粉丝总曝光次数”。(只统计粉丝的,文章下面的非作者粉丝阅读和曝光不计数)

创作者和粉丝关系表
author_id fans_id create_date
332579 985035 2022/1/1
332579 849602 2022/1/15
332579 952566 2022/3/20
970382 930554 2022/6/1
970382 985035 2022/9/23
960725 590742 2022/11/10
960725 985035 2022/12/6
960725 940672 2023/1/12
960725 392056 2023/2/10

创作者和内容关系表
author_id content_id
332579 790046624
332579 391056935
970382 486962456
970382 359325633
970382 899054463
960725 125225355
490626 738258392
490626 678329246
230563 239587593

粉丝在内容上的行为明细表
content_id fans_id show_num read_num like_num comment_num
790046624 985035 1 1 0 0
790046624 583951 1 1 0 0
391056935 123573 1 1 0 1
391056935 395621 1 1 0 1
391056935 985035 2 1 0 1
486962456 985035 1 1 1 1
486962456 838495 1 1 1 1
359325633 952566 2 0 0 0
899054463 952566 1 0 0 0
125225355 985035 1 1 1 0
输出示例
fans_ctr
0.8000

示例1

输入

drop table if exists a;
create table `a` (
author_id varchar(32) not null,
fans_id varchar(32) not null,
create_date varchar(32) not null
);
insert into a values ('332579','985035','2022/1/1');
insert into a values ('332579','849602','2022/1/15');
insert into a values ('332579','952566','2022/3/20');
insert into a values ('970382','930554','2022/6/1');
insert into a values ('970382','985035','2022/9/23');
insert into a values ('960725','590742','2022/11/10');
insert into a values ('960725','985035','2022/12/6');
insert into a values ('960725','940672','2023/1/12');
insert into a values ('960725','392056','2023/2/10');


drop table if exists b;
create table `b` (
author_id varchar(32) not null,
content_id varchar(32) not null
);
insert into b values ('332579','790046624');
insert into b values ('332579','391056935');
insert into b values ('970382','486962456');
insert into b values ('970382','359325633');
insert into b values ('970382','899054463');
insert into b values ('960725','125225355');
insert into b values ('490626','738258392');
insert into b values ('490626','678329246');
insert into b values ('230563','239587593');


drop table if exists c;
create table `c` (
content_id varchar(32) not null,
fans_id varchar(32) not null,
show_num int not null,
read_num int not null,
like_num int not null,
comment_num int not null
);
insert into c values ('790046624','985035',1,1,0,0);
insert into c values ('790046624','583951',1,1,0,0);
insert into c values ('391056935','123573',1,1,0,1);
insert into c values ('391056935','395621',1,1,0,1);
insert into c values ('391056935','985035',2,1,0,1);
insert into c values ('486962456','985035',1,1,1,1);
insert into c values ('486962456','838495',1,1,1,1);
insert into c values ('359325633','952566',2,0,0,0);
insert into c values ('899054463','952566',1,0,0,0);
insert into c values ('125225355','985035',1,1,1,0);

输出

fans_ctr
0.8000
这题目压根没写完整吧......
发表于 2025-01-18 14:57:59 回复(2)
题目信息根本不全,以abc做表名也太潦草了,题目目的也不明确。
发表于 2025-04-28 10:39:21 回复(0)
(不关注content的作者,也会收到该内容的曝光并阅读该内容)
SELECT  SUM(read_num)/SUM(show_num) AS fans_ctr
FROM c
JOIN b ON b.content_id=c.content_id
JOIN a ON b.author_id = a.author_id AND c.fans_id=a.fans_id 
-- c表创作内容(content)的曝光对象(fans_id)不一定是该内容创作者粉丝,需选出查看内容的阅读者(fans_id)是内容作者的粉丝的数据
发表于 2025-01-18 10:12:16 回复(0)
首先要确认主表是谁,这道题的要求来看,主表是C 行为明细表,然后使用join B 确认C表的创造内容属于哪个创造者,在join A 确认粉丝都属于哪个创作者, 因为涉及到的字段非唯一字段,所以join A需要用两个字段关联
select sum(read_num)/sum(show_num) fans_ctr from c  join b on c.content_id = b.content_id
 join a on a.author_id = b.author_id and c.fans_id = a.fans_id
发表于 2024-12-24 09:30:48 回复(0)
过不了:
select sum(c.read_num)/sum(c.show_num) as fans_ctr
from a
join b on a.author_id=b.author_id
join c on b.content_id=b.content_id
where a.fans_id=c.fans_id

官方的能过:
select
    sum(c.read_num) / sum(c.show_num) as fans_ctr
from
    a
    join b on a.author_id = b.author_id
    join c on b.content_id = c.content_id
where
    a.fans_id = c.fans_id

这题神经病

发表于 2025-05-08 15:26:56 回复(3)
没写完的条件:1.表明分别为abc 2.命名为fans_ctr
要点:对于一个author,只统计他的粉丝的数据
select sum(read_num)/sum(show_num) fans_ctr
from b
join c
on b.content_id = c.content_id
where (author_id, fans_id) in
(select author_id, fans_id
from a)

发表于 2025-03-06 16:18:55 回复(0)
select
sum(read_num) / sum(show_num) as fans_ctr
from
a,
b,
c
where a.author_id = b.author_id
and b.content_id = c.content_id
and a.fans_id = c.fans_id

发表于 2025-02-05 14:26:11 回复(0)
SELECT
    SUM(CASE WHEN a.fans_id = c.fans_id THEN read_num ELSE 0 END) / SUM(CASE WHEN a.fans_id = c.fans_id THEN show_num ELSE 0 END ) AS fans_ctr
FROM c
JOIN b USING (content_id)
JOIN a USING (author_id)
首先确定主表是c,但是需要a和b的补充信息。
所以用content_id把c和b先连起来,这样c表里就会多一行auhtor的信息。
再用author_id把a连进来。
现在每一条content_id后面会有
1. content响应者id
2. content作者id
3. content作者的原粉丝id
考虑到现实业务中,即使这个人不是TA的粉丝也有可能对他的content做出反应。所以用了CASE WHEN把1和3是同一个人作为条件。
发表于 2025-08-19 14:51:10 回复(0)
WITH author_pl_tb AS
(SELECT b.author_id AS author_id, fans_id, show_num, read_num
FROM c
JOIN b
ON c.content_id = b.content_id)

SELECT SUM(read_num)/SUM(show_num) AS fans_ctr
FROM author_pl_tb apt
WHERE fans_id IN (SELECT fans_id FROM a WHERE author_id = apt.author_id)

为什么大家都是等于 不应该是 IN 吗

发表于 2025-07-07 10:12:51 回复(0)
题目描述不清楚。

对于c表中的每一条记录,和a表存在关联且和b表存在关联,才被纳入统计。

SELECT 
    CASE 
        WHEN SUM(show_num) > 0 THEN SUM(read_num) / SUM(show_num)
        ELSE 0
    END AS fans_ctr
FROM 
c
JOIN b ON b.content_id=c.content_id
JOIN a ON b.author_id = a.author_id AND c.fans_id=a.fans_id 






发表于 2025-04-26 17:44:38 回复(0)

注意:(只统计粉丝的,文章下面的非作者粉丝阅读和曝光不计数)------------>添加:where a.fans_id = c.fans_id

select sum(c.read_num)/sum(c.show_num) as fans_ctr
from a
join b
on a.author_id = b.author_id
join c on
b.content_id = c.content_id
where a.fans_id = c.fans_id
发表于 2026-04-19 15:13:34 回复(0)
select
sum(read_num)/sum(show_num) as fans_ctr
from a join b on a.author_id=b.author_id join c on b.content_id=c.content_id
where c.fans_id in(select fans_id from a )
为什么这个输出是0.5714,奇怪
发表于 2026-03-28 18:12:45 回复(0)

感觉很多做法都没有考虑 用户会不会被推送未关注的作者发布的作品啊,也可能是这个题目没说清楚,具体思路我觉得这样挺清晰的:

select

    sum(read_num)/sum(show_num) as fans_ctr

from

    c

where

    (content_id,fans_id) in (

        select

            content_id,fans_id

        from  

            a join b on a.author_id = b.author_id

    )
发表于 2026-03-21 13:42:50 回复(0)
起码要给说明下每个表的字段的含义吧 
发表于 2026-03-18 17:40:37 回复(0)
select sum(read_num)/sum(show_num) fans_ctr
from a join b using(author_id)
join c on b.content_id = c.content_id and a.fans_id = c.fans_id

发表于 2026-03-14 18:43:00 回复(0)
c表的粉丝id该为用户id更合适一点
发表于 2026-03-11 22:36:27 回复(0)
又是脑残出题

发表于 2026-03-11 17:05:17 回复(0)
注意连接两个字段,才能表示是粉丝操作
select
sum(read_num)/sum(show_num) fans_ctr
from b
left join c on c.content_id=b.content_id
left join a on a.author_id=b.author_id and a.fans_id=c.fans_id
where a.fans_id is not null

发表于 2026-02-12 13:28:10 回复(0)
SELECT sum(read_num)/sum(show_num) fans_ctr FROM
    (SELECT a.author_id, a.fans_id, b.content_id, c.show_num, c.read_num 
    FROM a join b on a.author_id = b.author_id
        join c on b.content_id = c.content_id
    WHERE a.fans_id = c.fans_id) ctr

发表于 2026-02-06 10:00:33 回复(0)
看到大家都说题目表述不清楚我就放心了,我还以为是我的问题
发表于 2026-01-30 10:02:31 回复(0)