SQL(牛客网例题2)

25.题目:现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,请取出相应结果,结果不去重。

SELECT device_id,gender,age,gpa
FROM user_profile
where university='山东大学'

union all

SELECT device_id,gender,age,gpa
FROM user_profile
where gender='male'

 两种条件。union all结果不去重,union结果去重。

26.题目:现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段,分别查看这两个年龄段用户数量

本题注意:age为null 也记为 25岁以下

SELECT
CASE
WHEN age<25 or age is null THEN '25岁以下'
WHEN age>=25 THEN '25岁及以上'
END age_cut,count(*) as number
FROM user_profile
group by age_cut

CASE

WHEN 情况 THEN 处理方式

END   统计结果的标题

最后要按照25岁上下的情况进行分组,才能出现两种情况。

27.题目:现在运营想要将用户划分为20岁以下,20-24岁,25岁及以上三个年龄段,分别查看不同年龄段用户的明细情况,请取出相应数据。(注:若年龄为空请返回其他。) 

select device_id,gender,
case
when age<20 then '20岁以下'
when age between 20 and 24 then '20-24岁'
when age>=25 then '25岁及以上'
else '其他'
end age_cut
from user_profile

比26多了一个else分支 

28.题目:现在运营想要计算出2021年8月每天用户练习题目的数量,请取出相应数据。 

select
    day(date) as day,
    count(question_id) as question_cnt
from question_practice_detail
where month(date)=8
group by day

        day()可以把日期只留最后的日,去掉年月。

        把月提取出来用month() ,因此提取年用year()

        DAYOFWEEK  返回日期的星期索引。WEEKDAY。前者从星期日=1开始,后者从星期一=0开始。

        也可以用date_format(date, "%Y-%m")="202108"  Y表示年,m表示月

用户的平均次日留存率 

29.题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。

所谓次日留存,指的是同一用户在当天和第二天都进行刷题。distinct去重

下表来自:SQL Date 函数

NOW()返回当前的日期和时间
CURDATE()返回当前的日期
CURTIME()返回当前的时间
DATE()提取日期或日期/时间表达式的日期部分。如2008-12-29
EXTRACT()返回日期/时间按的单独部分
DATE_ADD()给日期添加指定的时间间隔。(列名,interval 间隔数 日期)
DATE_SUB()从日期减去指定的时间间隔
DATEDIFF()返回两个日期之间的天数。(日期1,日期2)最后是12
DATE_FORMAT()用不同的格式显示日期/时间
SELECT
    COUNT(q2.device_id) / COUNT(q1.device_id) AS avg_ret
FROM(
    select distinct device_id,date
    FROM question_practice_detail
    ) as q1
LEFT JOIN(
    select distinct device_id,date
    FROM question_practice_detail
    ) as q2
ON q1.device_id=q2.device_id
    AND q2.date=date_add(q1.date,interval 1 day)

这个表有点难。。我是参考了答案的结果。但是也可以分析一下解题思路。

公式是:(前一天登录的用户,今天仍然登录)/(前一天登录的用户)。所以基于同一客户,也就是他们的device_id是一样的,差距在date=1就可以了。

首先,次数存活率就是第一天的用户第二天还登陆APP的比例。用q1.device_id和q2.device_id分别代表第一天的用户和第二天的用户。需要DISTINCT处理。

q1是第一天的用户,q2是第二天的用户。q2中用到了表里提到的date_add函数,可以把日期间隔1天找到第二天的情况。 

30 统计每种性别的人数

题目:现在运营举办了一场比赛,收到了一些参赛申请,表数据记录形式如下所示,现在运营想要统计每个性别的用户分别有多少参赛者,请取出相应结果.

 

SELECT 
    substring_index(profile, ',', -1) as gender,
    COUNT(device_id) as number
from user_submit
group by gender

需要按照gender分组,但是列表没有gender这一列,而在profile这一列的最后一个字符的位置。

需要用substring_index(字段, sep, n)可以将字段按照sep分隔:
(1).当n大于0时取第n个分隔符(n从1开始)之前的全部内容;
(2).当n小于0时取倒数第n个分隔符(n从-1开始)之后的全部内容;

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值