首页 > 数据库 >视频号数据分析组外包招聘笔试题SQl题目

视频号数据分析组外包招聘笔试题SQl题目

时间:2024-09-10 11:51:43浏览次数:3  
标签:数据分析 ds action video user SQl 组外 id select

一.表结构与要求

要求如下:
视频号数据分析组外包招聘笔试题时间限时 45 分钟完成。
题目 根据 3 张表表结构,写出具体求解的 SQL 代码 (搞笑品类定义:视频分类或者视频创建者分类为“搞笑”)

三张表如下:

二.建表语句

create table t_user_video_action_d(
    ds int,
    user_id string,
    video_id string,
    action_type int,
    `timestamp` bigint
)
row format delimited
fields terminated by ',';

create table t_video_d(
    ds int ,
    video_id string,
    video_type string,
    video_user_id string,
    video_create_time bigint,
    video_description string
)
row format delimited
fields terminated by ',';

create table t_video_user_d(
    ds int,
    video_user_id string,
    video_user_name string,
    video_user_type string

)
row format delimited
fields terminated by ',';

三.具体问题以及代码实现

题目 1:输出一张搞笑品类 dws 表,用于分析作者近 3 条视频情况:输出每个视频创建者 user_id 最近发布的 3 个视频,在过去一周内的曝光,点赞总数;需要产出字段:视频创建者 user_id,曝光用户数,点赞用户数,曝光次数、点赞次数。

select `current_date`();
select unix_timestamp();
select unix_timestamp()-7*24*3600;
select from_unixtime(1725326963+8*3600);
with t as (
   select uva.user_id,action_type,row_number() over (partition by uva.user_id order by video_create_time desc ) px from t_user_video_action_d uva join t_video_d  tvd on uva.user_id=tvd.video_user_id
            and uva.video_id = tvd.video_id  where tvd.video_type='搞笑' and video_create_time >= (unix_timestamp()-7*24*3600)
)
select
    user_id,
    count(if(t.action_type=1,t.user_id,null) ) `曝光用户数`,
    count(if(t.action_type=2,t.user_id,null) ) `点赞用户数`,
    count(if(t.action_type=1,1,null) ) `曝光次数`,
    count(if(t.action_type=1,1,null) ) `点赞次数`
    from t where t.px <= 3 group by user_id;

题目 2:输出一个取数结果:在 20221103 日创建的视频中,如果视频描述中带有 "搞笑段子”,“脱口秀”两个关键词即为“搞笑类内容”,不带有这两个关键词为“非搞笑类内 容”,最终输出 20221103 日搞笑与非搞笑视频去重数量。

-- 假如你创建的是分区表,其实可以使用分区表字段进行判断  ds = '20221103'
select "搞笑类视频" `类别`,count(1) `数量` from t_video_d
         where video_description like '%搞笑段子%' or video_description like '%脱口秀%'
           and  from_unixtime(t_video_d.video_create_time+8*3600,'yyyyMMdd') ='20221103'
union
select "非搞笑类视频",count(1)  from t_video_d
         where video_description not like '%搞笑段子%' and  video_description not  like '%脱口秀%'
         and  from_unixtime(t_video_d.video_create_time+8*3600,'yyyyMMdd') ='20221103';

-- 第二种写法
select
    sum(case when video_description like '%搞笑段子%' or video_description like '%脱口秀%' then 1 else 0 end)  `搞笑视频数量`,
    sum(case when video_description not like '%搞笑段子%' and  video_description not  like '%脱口秀%' then 1 else 0 end) `非搞笑视频数量`
   from t_video_d where  from_unixtime(t_video_d.video_create_time+8*3600,'yyyyMMdd') ='20221103';

题目 3:计算每个用户每天第一次曝光视频的时间戳,运行速度越快越好,输出字段 日期, 用户 id,时间戳

select user_id,ds,min(`timestamp`) from
     t_user_video_action_d where action_type = 1 group by user_id,ds;

题目 4:输出一张 dws 表,查询过去任意日期的曝光活跃用户的 7 日留存率,输出字段日期,用户 id,7 日留存率具体表结构如下表 1 用户行为表:t_user_video_action_d
l分区:ds(格式 yyyyMMdd)
l主键:user_id、video_id
l含义:一个用户对一个视频的所有行为聚合,每天增量 字段名字段含义类型

留存用户:某段时间内的新增用户,经过一段时间后,又继续使用应用的被认作留存用户
留存率:留存用户占新增用户的比例即是留存率
需要注意的是与连续登录不同的是留存只需要在规定时间内有过登录就行,而不是每天都需要登录。

-- 先查看曝光的用户和日期
with t as (
    -- 9-10  zhangsan
    -- 9-10  lisi
    -- 9-17  zhangsan
    select ds,user_id  from t_user_video_action_d where action_type = 1 group by user_id,ds
)
-- 让7天前的数据 处于 当前数据 = 留存率  ds=20240910
, t2 as (
    select ds,user_id  from t where ds =
       date_add(from_unixtime(unix_timestamp("20240910",'yyyyMMdd'),'yyyy-MM-dd'),7)
)
select
    t.user_id,count(t2.user_id)/count(t.user_id) `七日留存率`
    from t left join t2 on t.user_id = t2.user_id group by t.user_id;

-- 如何将20240910 --> 2024-09-10
-- 字符串转时间戳
select unix_timestamp("20240910",'yyyyMMdd');
select from_unixtime(unix_timestamp("20240910",'yyyyMMdd'),'yyyy-MM-dd');
select date_add(to_date('2024-09-10'),7);

-- 拓展  通过拼接的方式将20240910 --> 2024-09-10
SELECT   
  concat(  
    substr('20240910', 1, 4),   
    '-',   
    lpad(substr('20240910', 5, 2), 2, '0'),   
    '-',   
    lpad(substr('20240910', 7, 2), 2, '0')  
  ) as formatted_date;

标签:数据分析,ds,action,video,user,SQl,组外,id,select
From: https://blog.csdn.net/yyzzyyds/article/details/142094222

相关文章

  • 基于java ssm vue mysql大学校医院信息管理系统毕业设计项目实战分享
    前言......
  • 09django基于Python的智能热门旅游景点数据分析可视化系统的设计与实现
    前言......
  • Web安全与网络安全:SQL漏洞注入
    Web安全与网络安全:SQL漏洞注入引言在Web安全领域,SQL注入漏洞(SQLInjectionVulnerability)是一种极具破坏性的安全威胁。它允许攻击者通过向Web应用程序的输入字段中插入或“注入”恶意的SQL代码片段,从而操纵后台数据库系统,执行未授权的数据库查询,甚至可能获取数据库管理权......
  • 2000万的行数还是 MySQL 表的限制吗?
    传闻网络上一直流传着一种观点,认为在单个MySQL表中,数据的行数一旦超过2000万,表的性能就可能受到影响。这种观点主要源于早些时候使用HDD硬盘存储时的经验。2024年了,当我们使用基于SSD的MySQL数据库时,这种判断是否依然有效。换句话说,基于现代存储技术,MySQL表的行数是否仍然需要限......
  • 用 SQL 写的俄罗斯方块游戏「GitHub 热点速览」
    在开始介绍上周热门开源项目之前,要插播一条开源新闻:Nginx已正式迁移至GitHub。近日,Nginx官方宣布将Nginx开源项目,从Mercurial迁移至GitHub代码托管平台,并开始接受PR形式的贡献、Issues问题反馈和功能请求等,GitHub上的Nginx项目终于“活”了!GitHub地址→github......
  • MySQL timestamp和datetime用法详解
    一、MySQL中如何表示当前时间?其实,表达方式还是蛮多的,汇总如下:CURRENT_TIMESTAMPCURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMPLOCALTIMESTAMP() 二、关于TIMESTAMP和DATETIME的比较一个完整的日期格式如下:YYYY-MM-DDHH:MM:SS[.fraction],它可分为两部......
  • MySQL 8.0修改密码
    最近系统升级牵涉到MySQL升级,需要升级到MySQL8.0,涉及MySQL用户的密码修改,特地记录一下!MySQL8.0前修改密码在MySQL8.0前,执行:SETPASSWORD=PASSWORD('[新密码]')进行密码修改,在MySQL8.0后,以上的方法使用root用户修改别的用户密码是报错的,因为MySQL8.0后修改了修改密码的方......
  • 【开源dcluster】Seatunnel数据同步之MySQL同步到doris
    源码Gitee地址:https://gitee.com/zhenglv123456/dcluster在线文档:https://47.121.127.33:8090/在线体验:http://36.155.14.171:12345/dolphinscheduler/ui/login账号密码:test/test123 创建同步任务操作步骤:1.点击创建任务 2.配置同步脚本 3.设置同步时间......
  • mysql 调优
    一、缓冲池​​​​​14.5.1BufferPool缓冲池是主内存中的一个区域,InnoDB在访问表和索引数据时将其缓存。缓冲池允许直接从内存访问经常使用的数据,从而加快处理速度。在专用服务器上,高达80%的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率,缓冲池被划分为可能容纳多......
  • Python 操作 MySQL 数据库
    什么是MySQLdb?如何安装MySQLdb?数据库连接创建数据库表数据库插入操作数据库查询操作数据库更新操作删除操作执行事务错误处理Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的数据库,你......