当前位置: 首页 > news >正文

江西省网站备案/武汉seo工厂

江西省网站备案,武汉seo工厂,做气体检测仪的网站,做健康食品的网站【题目】“用户活跃表”记录了用户的登录信息,包括用户标识、用户登录日期,以及是否是新用户(如果是新注册的用户值为1;如果是老用户,值为0)。“领取红包表”里记录了用户领取红包的信息,包括抢…

【题目】

“用户活跃表”记录了用户的登录信息,包括用户标识、用户登录日期,以及是否是新用户(如果是新注册的用户值为1;如果是老用户,值为0)。

“领取红包表”里记录了用户领取红包的信息,包括抢红包日期、抢红包时间、用户ID、领取红包金额。

现在业务部门需要分析出以下问题:

1.计算2019年6月1日至今,每日DAU(活跃用户是指有登陆的用户)

2.分析每天领取红包的用户数、人均领取金额、人均领取次数,要考虑用户属性及领取红包未登录情况。

3.分析每个月按领红包取天数为1、2、3……30、31天区分,计算取每个月领取红包的用户数,人均领取金额,人均领取次数。

4.分析每个月领过红包用户和未领红包用户的数量

【分析思路】

1.计算2019年6月1日至今,每日DAU(活跃用户是指有登陆的用户)

每日DAU(有登陆的用户数)用到的表是“用户活跃表”。当出现“每天”要想到《猴子 从零学会sql》里讲过的分组汇总来解决这样的问题。

用“日期”来分组(group by),用count(用户ID)来汇总登录用户。

sql代码如下

select 登录日期,count(用户ID) as 活跃用户量DAU
from 活跃用户表
where 登录日期>20190601
group by 登录日期;

查询结果如下

2.分析每天领取红包的用户数、人均领取金额、人均领取次数,要考虑用户属性及领取红包未登录情况。注意:保留两位小数。

(1)“每天领取红包的用户”包括新用户、老用户、领取红包但未登录的用户。新、老用户数用到的表是“用户活跃”表,领取红包但未登录的用户数要用到两个表:“用户活跃”表和“领取红包”表。

(2)“人均领取金额”、“人均领取次数”用到的表是“领取红包”表。

这里涉及到两个表“用户活跃”表和“领取红包”表,所以遇到多表查询的情况,要想到多表联结。下图是两表联结的条件(通过用户ID和日期联结)。

(3)使用哪种联结呢?

因为要查询的是领取红包的用户,所以要保留“领取红包”表(上图右表)中的全部数据,因此使用右联结。

两表联结的sql如下:

select n.抢红包日期,n.用户ID,p.金额,m.新用户
from 用户活跃表 as m
right join 领取红包表 as n
on m.登录日期=n.抢红包日期 and m.用户ID=n.用户ID;

【解题步骤】

(1)将“每天领取红包的用户”即新用户、老用户、领取红包但未登录的用户进行区分。

也就是“用户或活跃”表和“领取红包”表右联结,如果"新用户“=1 则是新用户,"新用户“=10则是老用户,如果"新用户“=1 = null表示两表没有匹配的值,说明该用户未登录。

涉及到多条件判断的问题,要想到用case语句来实现:

case when 新用户=1 then 新用户when 新用户=0 then 老用户else 未登录用户
end

把两表联结的sql代入上面sql,就得到了:

select n.抢红包日期,n.用户ID,n.金额,
(case when m.新用户=1 then 新用户when m.新用户=0 then 老用户else 未登录用户
end) as 新老用户标识
from 用户活跃表 as m
right join 领取红包表 as n
on m.登录日期=n.抢红包日期 and ,.用户ID=n.用户ID;

查询结果如下:

(2)把上一步的查询结果记为临时表a。从a表中,用分组汇总,求出每类用户的个数,人均领取金额,人均领取次数。

人均领取金额=总金额/用户数=sum(金额)/count(distinct 用户ID)

人均领取次数=领取次数(也就是有多少行数据)

=count(*)/count(distinct 用户ID) 

(3)将上述两个步骤的sql合并到一起,就是最终sql

select a.抢红包日期,
count( case when a.新老用户标识='新用户' then 用户ID else null end) as 新用户数,
count( case when a.新老用户标识='老用户' then 用户ID else null end) as 老用户数,
count( case when a.新老用户标识='未登录用户' then 用户ID else null end) as 未登录用户,
sum(a.金额)/count(distinct a.用户ID) as 人均领取金额,
count(*)/count(distinct a.用户ID) as 人均领取次数
from (
select n.抢红包日期,n.用户ID,n.金额,
(case when m.新用户=1 then 新用户when m.新用户=0 then 老用户else 未登录用户
end) as 新老用户标识
from 用户活跃表 as m
right join 领取红包表 as n
on m.登录日期=n.抢红包日期 and ,.用户ID=n.用户ID
) as a
group by a.抢红包日期;

结果如下图

3.分析每个月按领红包取天数为1、2、3……30、31天区分,计算取每个月领取红包的用户数,人均领取金额,人均领取次数。注意:保留两位小数。

【分析思路】

领取红包用到的表是“领取红包”表。出现“每个月”这样的字眼,和就要想到用分组汇总来解决此类问题,按“月份”分组。

使用month(日期)获取月份。

人均领取金额=总金额/去重的用户数=sum(金额)/count(distinct 用户ID)

人均领取次数=领取次数(也就是有多少行数据)

=count(*)/count(distinct 用户ID) 

select month(抢红包日期) as 月份,
count(distinct 抢红包日期) as 领取天数,
count(distinct 用户ID) as 每个月领取红包的用户数,
sum(金额)/count(distinct 用户ID), as 人均领取金额,
count(*)/count(distinct 用户ID) as 人均领取次数
from 领取红包表
group by month(抢红包日期);

查询结果如下:

4. 分析每个月领过红包用户和未领红包用户的数量

【分析思路】

“领过红包用户”和“未领红包用户”什么意思?

将“用户登录”表和“领取红包”表进行左联结。

select m.登录日期, m.用户ID,n.用户ID as 红包用户ID
from 用户活跃表 as m
left join 领取红包表 as n
on a.登录日期 = b.抢红包日期 and a.用户ID = b.用户ID;

如果“领取红包”表中的用户为非空,那么该用户是“领过红包用户”(也就是在“领取红包”表中匹配到了数据);如果“领取红包”表中的用户为空的,那么该用户是“未领取红包用户”(也就是在“领取红包”表没有匹配到数据)。用case语句来判断。

(case when 用户ID  is not null then 领过红包用户else  未领取红包用户 
end) as 是否红包用户

把case语句代入上面左联结的sql就是:

select m.登录日期, m.用户ID,n.用户ID as 红包用户ID,
(case when 用户ID  is not null then 领过红包用户else  未领取红包用户 
end) as 是否红包用户
from 用户活跃表 as m
left join 领取红包表 as n
on a.登录日期 = b.抢红包日期 and a.用户ID = b.用户ID;

把上面查询结果记为临时表a,题目要分析的是“每个月领过红包用户”和“每个月未领红包用户”,用户分组汇总来解决此类问题。按月份分组(group by)用sum来统计数量。

select month(登陆日期),
sum(case when a.是否红包用户='领过红包用户' then 1else 0end) '红包用户数',
sum(case when a.是否红包用户='未领取红包用户' then 1 else 0end)  '非红包用户数’
from a
group by mount(登陆日期);

将临时表a的sql代入上面sql语句,查询结果如下图

【本题考点】

1.多表查询的理解和灵活应用,记住下图可以解决99%的多表查询问题。

2.有“每个”出现的时候,要想到用分组汇总来解决。

3.条件判断的问题,用case语句来解决,例如本文的面试题“新用户“、”老用户“。

4.按条件统计数量的时候,要结合case语句和sum来统计数,例如之前课程里讲过的下面案例

推荐:如何从零学会sql?

http://www.lbrq.cn/news/1465093.html

相关文章:

  • 网站css下载/南昌网站优化公司
  • 小男孩与大人做的网站/长春网站推广公司
  • 成都移动网站建设/好搜seo软件
  • 做爰全过程免费狐狸网站/四川网站制作
  • wordpress清理插件/seo是什么化学名称
  • 网站设计一级网页/中国免费网站服务器2020
  • 建设局网站建设方案书/东莞关键词排名优化
  • 个人网站备案能几个/网络广告
  • 南昌网站建设培训学校/如何做关键词优化
  • 眉山市做网站的公司/seo到底是什么
  • 选服务好的网站建设公司/企业网站设计图片
  • 网站增长期怎么做/如何进行网络营销策划
  • 网站公安局备案 所需要的材料/seo月薪
  • c 网站做死循环/抖音优化
  • 网站高中建设工具/百度刷排名seo
  • 外贸网站推广渠道/seo技术培训岳阳
  • 上海品牌网站开发/山东泰安网络推广
  • asp.net网站支持多国语言/进入百度官网首页
  • 模板网站也可以做优化/互联网广告是做什么的
  • 一级a做爰片免费视频网站/国外免费建站网站
  • 钢铁网站哪家做的好/互联网关键词优化
  • 个人备案可以做哪些网站/建立网站的流程
  • 张氏万家网站建设/我想做电商怎么加入
  • asp故障解答网站模板/seo优化工作内容
  • 给女朋友做的网站/semester是什么意思
  • 苏州加基森网站建设/海南百度推广代理商
  • 欧洲vodafonewifi巨大app3di/seo 论坛
  • 青岛经济师考试/什么公司适合做seo优化
  • 南京电商网站开发/成都高端品牌网站建设
  • 跨境电商开店详细步骤/沈阳百度seo排名优化软件
  • (FD Conv)Frequency Dynamic Convolution for Dense Image Prediction论文精读(逐段解析)
  • 决策树学习全解析:从理论到实战
  • 【PHP】接入百度AI开放平台人脸识别API,实现人脸对比
  • 从 0 到 1 认识 Spring MVC:核心思想与基本用法(下)
  • 开源医院信息管理系统:基于若依框架的智慧医疗解决方案
  • anaconda searchanaconda show | conda 检索包资源安装指定版本包指定源安装命令package