【数据分析面试】27. 计算广告评论比例 (SQL)

ops/2024/9/23 10:20:08/

在这里插入图片描述

题目: 计算广告评论比例

假设你有一个ads表,包含ID和广告名称,比如“劳动节衬衫促销”。feed_comments表保存了不同用户在常规信息流中对广告的评论。moments_comments表保存了不同用户在moments中对广告的评论。

编写一个查询,获取广告在feed和moments中的评论比例。
示例:
输入:

feed_comments

列名类型
ad_id整数
user_id整数
comment_id整数

moments_comments

列名类型
ad_id整数
user_id整数
comment_id整数

ads

列名类型
id整数
nameVARCHAR

输出:

名称feed评论比例moments评论比例
劳动节.6.4
Polo衬衫.85.15

答案

对于每个广告,我们想要的是来自feed和moments的评论比例:

% feeds = feed的评论数 / (feed的评论数 + moments的评论数)
% moments = moments的评论数 / (feed的评论数 + moments的评论数)

先看看feed_comments表。想要求每个ad_id的总评论数,我们可以简单地使用GROUP BY来计数。

SELECT ad_id, COUNT(DISTINCT comment_id) AS num_comments
FROM feed_comments AS fc 
GROUP BY 1

这里还需要注意到一个细节:如果一个广告在feed_comments表中不存在,但存在于ads表或moments_comments表中,上面的方法就会将该广告过滤掉,使其评论计数为零。

我们可以通过将表左连接到来解决这个问题,同样moments_comments表也需要执行相同的操作。

WITH fc AS (SELECT ads.id AS ad_id, COUNT(DISTINCT comment_id) AS num_commentsFROM adsLEFT JOIN feed_comments AS fc ON ads.id = fc.ad_idGROUP BY 1
),
mc AS (SELECT ads.id AS ad_id, COUNT(DISTINCT comment_id) AS num_commentsFROM adsLEFT JOIN moments_comments AS mc ON ads.id = mc.ad_idGROUP BY 1
)
SELECT * FROM fc,mc

现在给定这两个计数,我们可以将它们与广告表连接起来,获取每个广告的名称,并计算总比例的方程式。

WITH fc AS (SELECT ads.id AS ad_id, COUNT(DISTINCT comment_id) AS num_commentsFROM adsLEFT JOIN feed_comments AS fc ON ads.id = fc.ad_idGROUP BY 1
),
mc AS (SELECT ads.id AS ad_id, COUNT(DISTINCT comment_id) AS num_commentsFROM adsLEFT JOIN moments_comments AS mc ON ads.id = mc.ad_idGROUP BY 1
)
SELECT ads.name, fc.num_comments/(fc.num_comments + mc.num_comments) AS percentage_feed, mc.num_comments/(fc.num_comments + mc.num_comments) AS percentage_moments
FROM ads
LEFT JOIN fc ON ads.id = fc.ad_id 
LEFT JOIN mc ON ads.id = mc.ad_id

更多详细答案可关注公众号查阅。
在这里插入图片描述


http://www.ppmy.cn/ops/9707.html

相关文章

vue3父组件使用子组件方法

问题 关于父组件调用子组件方法是比较常见的情况&#xff0c;vue2中使用比较简单&#xff0c;那么vue3 中如何使用呢&#xff1f; 想要的效果&#xff1a; vue2 中调用子组件方法 先看下vue2中如何调用的&#xff0c;代码如下&#xff1a; // child.vue <template>&…

v-deep 打破作用域隔离的原理

vue 中使用 scoped 样式隔离 使用 ::v-deep 和 >>> &#xff0c;穿透作用域样式&#xff0c;以便在父组件中修改子组件的样式&#xff0c;即打破样式隔离。 vue 使用了一种叫做 scoped css 的技术来隔离组件的样式&#xff0c;确保他们不会泄漏到其他组件中&#xf…

基于Tensorflow完成mnist数据集的数字手写体识别

基于Tensorflow完成mnist数据集的数字手写体识别 关于知识背景CNNFCNN 关于数据集新的改变 关于知识背景 CNN 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是一种具有局部连接、权值共享等特点的深层前馈神经网络&#xff08;Feed…

go语言并发编程(五) ——Context

Context(上下文) 前言 Context是go语言中所提供的一种并发控制的解决方案,相比于管道与WaitGroup,Context可以更好的控制子孙协程以及层次更深的协程。Context本身是一个接口&#xff0c;只要我们实现了该接口都可以被称为上下文&#xff0c;context标准库本身也提供了几个实…

C#各大版本特性

总目录 C# 语法总目录 C#各大版本特性目录 C#各大版本特性C#10.0C#9.0C#8.0C#7.0C#6.0C#5.0C#4.0C#3.0C#2.0 C#各大版本特性 C#10.0 支持全局using语句&#xff1a;现在可以在整个项目中使用全局using语句&#xff0c;在所有文件中自动引用命名空间&#xff0c;不需要在每个文…

ubuntu快捷更pip源

py安装: apt-get install python3-pip终端输入: pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

最优控制理论笔记 - 03无约束条件下的泛函极值问题

一、始端时刻t0和终端时刻tf时刻都给定的泛函极值问题 其中式子2.8为欧拉方程&#xff0c;式子2.9为横截条件。 上述推导的重要作用在于将求泛函的极值问题转化为求解欧拉方程在满足边界条件和横截条件下的定解问题。 1. 固定始端和终端 2. 自由始端和自由终端 3. 自由始端和…

《QT实用小工具·三十六》metro风格的主界面

1、概述 源码放在文章末尾 该项目实现了metro风格的主界面&#xff0c;包含访客登记&#xff0c;记录查询&#xff0c;证件扫描&#xff0c;信息打印&#xff0c;系统设置&#xff0c;系统重启等功能&#xff0c;项目demo演示如下所示&#xff1a; 源码下载