• SQL面试题


    第一题 

    1.创建数据表

    1. CREATETABLE `mili` (
    2.    statics_date varchar(255) NOT NULL,
    3.    channel varchar(30) NOT NULL,
    4.         type tinyint NOT NULL,
    5.         `desc` varchar(30) NOT NULL,
    6.         registerTime datetime NOT NULL,
    7.         nickName varchar(30) NOT NULL,
    8.         `change` int(10) NOT NULL,
    9.         uid int(10) NOT NULL,
    10.         balance int(10) NOT NULL,
    11.         registerip varchar(255) NOT NULL
    12.  );

    2.插入数据

    1. -- 插入数据
    2. insert into mili values
    3. ('2023/2/1', 'vivo', 1, '账号创建', '2023-02-01 20:59:47', 34508904, 0, 34508904,0,'125.212.159.63'),
    4. ('2023/2/1', '苹果', 2, '充值', '2023-02-01 18:59:47', 34508904, 0, 34508904,0,'103.199.35.197'),
    5. ('2023/2/1', '苹果', 2, '账号创建', '2023-02-01 13:59:47', 98385134, 0, 98385134,0,'113.185.35.201'),
    6. ('2023/2/1', '小米', 2, '提现', '2023-02-01 15:59:47', 34508904, 0, 34508904,0,'129.130.146.80'),
    7. ('2023/2/1', '小米', 2, '充值', '2023-02-01 15:59:47', 98385134, 0, 98385134,0,'129.130.146.80'),
    8. ('2023/3/2', 'vivo', 2, '提现', '2023-03-02 15:22:24', 55808099, 0, 55808099,0,'129.130.146.80'),
    9. ('2023/3/2', '华为', 2, '提现', '2023-03-02 15:22:24', 44808088, 0, 44808088,0,'129.130.146.80'),
    10. ('2023/3/17', '华为', 2, '账号创建', '2023-03-17 15:22:24', 22808000, 0, 22808000,0,'119.130.146.10'),
    11. ('2023/3/17', 'vivo', 2, '充值', '2023-03-17 15:22:24', 22808000, 0, 22808000,0,'119.130.146.10'),
    12. ('2023/3/17', '华为', 2, '提现', '2023-03-17 15:22:24', 22808000, 0, 22808000,0,'119.130.146.10'),
    13. ('2023/3/16', 'vivo', 1, '账号创建', '2023-03-16 20:59:47', 89008904, 0, 89008904,0,'125.212.159.63');
    1. 首先从 mili 表中筛选出所需数据,使用 SELECT 语句,选择 statics_date, channel, uid,同时使用 AS 关键字给三个字段重新命名为“日期”、“渠道”、“用户数量”;
    2. 筛选条件是 `desc` 字段等于“账号创建”,使用 WHERE 语句;
    3. 使用 GROUP BY 语句按“日期”、“渠道”分组,统计每组的用户数量,并对两个字段进行升序排序;
    4. 最后使用 LIMIT 语句,只取前五行。
    1. select
    2. statics_date as 日期,
    3. channel as 渠道,
    4. count(distinct uid) as 用户数量
    5. from
    6. mili
    7. where
    8. `desc` = "账号创建"
    9. GROUP BY
    10. 日期, 渠道
    11. ORDER BY
    12. 日期 desc, 渠道 desc
    13. limit 5;

    2.从表mili中选择registerip作为注册IP,统计不重复的uid数作为用户数量,并且按照registerTime降序排列后用逗号分隔渠道,取名为渠道。然后按照用户数量降序排列,只保留用户数量大于等于2的数据。

    解题思路:

    1. 首先从表mili中选择需要的列。

    2. 用GROUP BY对registerip进行分组,并用count(distinct uid)函数统计不重复的用户数量。

    3. 在统计渠道时,需要使用GROUP_CONCAT函数将渠道以逗号分隔的格式连接起来。

    4. 最后使用HAVING进行筛选,只保留用户数量大于等于2的数据,并按照用户数量降序排列

    1. select
    2. registerip as 注册ip,
    3. count(distinct uid) as 用户数量,
    4. GROUP_CONCAT(distinct channel order by registerTime desc SEPARATOR ',') as 渠道
    5. from
    6. mili
    7. GROUP BY
    8. 注册ip
    9. having
    10. 用户数量 >= 2
    11. ORDER BY
    12. 用户数量 desc
    1. 1.使用`date(registerTime) = statics_date`条件将`mili`表中`registerTime`字段的日期和`statics_date`中的所有日期进行匹配。
    2. 2.使用`GROUP BY`对`日期`进行分组。
    3. 3. 在`SELECT`语句中,使用`count(distinct case...`将查询结果按条件进行统计。例如,`count(distinct case when `desc`="充值" then uid end)`将计算每个日期中`desc`为“充值”的用户数。
    4. 4.最后,使用`concat(round(count(distinct case when `desc`="提现" then uid end ) / count(distinct case when `desc`="充值" then uid end ),2) * 100,'%')`将计算每个日期中进行了“提现”操作的用户相对于进行了“充值”操作的用户的比例,并将结果格式化成百分数形式。
    1. select
    2. statics_date as 日期,
    3. count(distinct case when `desc`="充值" then uid end) as `新充用户`,
    4. count(distinct case when `desc`="提现" and uid in(
    5. select uid from mili where `desc`="账号创建" and date(registerTime) = statics_date) then uid end
    6. ) as `新提现用户`,
    7. concat(round(count(distinct case when `desc`="提现" and uid in(
    8. select uid from mili where `desc`="账号创建") then uid end
    9. ) / count(distinct case when `desc`="充值" and uid in(
    10. select uid from mili where `desc`="账号创建") then uid end
    11. ),2) * 100,'%') as `新用户充提比`
    12. from
    13. mili
    14. where
    15. date(registerTime) = statics_date
    16. GROUP BY
    17. 日期

     第二题

    列名:statics_date:统计日期,channel:渠道,type:类型,desc:描述,registerTime:用户注册时间,用SQL,写出每日用户新增最多的5个渠道

    1. SELECT
    2. statics_date AS 日期,
    3. channel AS 渠道,
    4. COUNT(DISTINCT uid) AS 新增用户数
    5. FROM
    6. mili
    7. WHERE
    8. `desc` = '账号创建'
    9. GROUP BY
    10. statics_date,
    11. channel
    12. ORDER BY
    13. statics_date,
    14. COUNT(DISTINCT uid) DESC
    15. LIMIT 5;

    第三题 :

    表:group_list
    group_id group_name group_city channel channel_id
    wx1000001 上海神犬1群 上海 投放
  • 相关阅读:
    废品回收小程序搭建,回收市场的机遇
    如何使用 RunwayML 进行创意 AI 创作
    使用Eclipse创建一个简单的servlet项目
    【kali-信息收集】(1.9)Metasploit+搜索引擎工具Shodan
    【Python语言速回顾】——基础语法
    中国财政科学研究院党委书记、院长刘尚希一行莅临麒麟信安调研
    面向对象(三):常用知识下
    有人会吗,做一下可以吗
    vue 的常用事件
    JVM常见面试题
  • 原文地址:https://blog.csdn.net/m0_53191230/article/details/136382987