MySQL学习十:常用函数与常见题型总结(持续更新中)

news2024/12/29 16:17:01

目录

  • 一、常用函数
    • 1.1 left 和 right 函数
    • 1.2 first_value 函数
    • 1.3 timestampdiff 函数
    • 1.4 datediff 函数
    • 1.4 date_sub 和 date_add 函数
  • 二、常见题型
    • 2.1 查询新登录用户总体的次日留存率(第一天新登录的总体用户,第二天再次登录的总体用户)
    • 2.2 查询每个日期登陆的新用户数量
    • 2.3 查询每个日期新用户的次日留存率
    • 2.4 统计每天的日活数及新用户占比
    • 2.5 查询文章 / 直播间同一时刻最大浏览人数 / 最大观看人数

本文基于前段时间在牛客网找的 MySQL 题目进行的练习,总结出了一些较为常用的函数,供大家进行一定的参考

一、常用函数

1.1 left 和 right 函数

作用 1:根据名字的前几位或者最后几位进行排序

# 根据名字的最后两位进行排序
select first_name
from employees
order by right(first_name, 2)

在这里插入图片描述

作用 2:根据日期的年份或月份筛选数据

# 筛选出入职年份为 2020 年的员工信息
select *
from employees
where left(hire_date, 4) = 2020

在这里插入图片描述

1.2 first_value 函数

作用:窗口函数中,取分区的第一行数据(通常是最小日期等数据)

select *,
first_value(date) over(partition by user_id order by date) as first_buy_date
from order_info

在这里插入图片描述

1.3 timestampdiff 函数

作用:计算两个时间的间隔(如第一个参数可以写年,月,日,小时,秒)
注意:小的时间放在第二个参数,大的时间放在第三个参数

select timestampdiff(day, '2024-01-06', '2024-03-28') result

在这里插入图片描述

1.4 datediff 函数

作用:返回两个日期相隔的天数
注意:大的时间放在第一个参数,小的时间放在第二个参数

select datediff('2022-04-29','2022-04-17') as 相隔天数

在这里插入图片描述

1.4 date_sub 和 date_add 函数

作用:将日期减少指定 day / month / year 等

select date_sub('2024-4-8', interval 3 day) as date1,
date_add('2024-4-8', interval 3 day) as date2

在这里插入图片描述


二、常见题型

2.1 查询新登录用户总体的次日留存率(第一天新登录的总体用户,第二天再次登录的总体用户)

① 建立两个表,表1 为每个用户的注册日期表,表2 为用户登陆表
② 以表1 为主表,与表2 进行 left join 的操作
③ 连接条件有 2 个:表1 中的 user_id = 表2 中的 user_id,且表1 中的用户注册日期 = date_sub (表2 中的用户登录日期,interval 1 day)
注意: 计算这种题型时,每个用户的注册日期表要放在最左侧作为主表,再左连接用户登陆表

例1:查询牛客网新登录用户总体的次日留存率

with reg as (
	select user_id, min(date) as reg_date
	from login
	group by 1
), -- 每个用户的注册日期表
log as(
	select user_id, date as login_date
    from login
    group by 1, 2
) -- 每个用户的登录日期表

select round(count(l.user_id)/count(r.user_id), 3) as p
from reg r
left join log l
on r.user_id = l.user_id
and r.reg_date = date_sub(l.login_date, interval 1 day)

在这里插入图片描述

2.2 查询每个日期登陆的新用户数量

① 建立两个表,表1 为所有用户登陆过的日期表(即所有日期),表2 为每个用户的注册日期表
② 以表1 为主表,与表2 进行 left join 的操作,连接条件:表1 中的日期 = 表2 中的每个用户的注册日期
③ 按照表1 中的日期进行分组,对 user_id 进行 count 操作(注意:按照日期和 user_id 一起进行分组得到的是每一个 user_id 在同一个日期的计数,都是 1,null 值计数为0)
注意: 计算这种题型时,所有用户登陆过的日期表(即所有出现过的日期)要放在最左侧作为主表,再左连接用户注册日期表

例2:查询牛客网每个日期登录新用户个数

with all_login_date as(
	select date
    from login
    group by 1
), -- 所有用户登陆过的日期表
reg as(
	select user_id,
    min(date) as reg_date
    from login
    group by 1
) -- 每个用户的注册日期表

select a.date as date, count(user_id) as new_user
from all_login_date a
left join reg b
on a.date = b.reg_date
group by 1

在这里插入图片描述

若查询所有信息,同时按照日期和 user_id 一起进行分组,结果如下:
在这里插入图片描述

2.3 查询每个日期新用户的次日留存率

① 建立三个表,表1 为所有用户登陆过的日期表,表2 为每个用户的注册日期表,表3 为每个用户的登录日期表
② 以表1 为主表,依次与表2,表3 进行 left join 的操作
③ 表2 与表3 的连接条件有 2 个:表2 中的 user_id = 表3 中的 user_id,且表2 中的用户注册日期 = date_sub (表3 中的用户登录日期,interval 1 day)
④ 按表1 中的日期进行分组
注意: 计算这种题型时,所有用户登陆过的日期表(即所有出现过的日期)要放在最左侧作为主表,再左连接用户注册日期表,最后左连接用户登录日期表

例3:查询牛客每个日期新用户的次日留存率

with all_login_date as(
	select date
    from login
    group by 1
),-- 所有用户登陆过的日期表
reg as(
	select user_id, min(date) as reg_date
    from login
    group by 1
), -- 每个用户的注册日期表
log as(
	select
    user_id, date as login_date
    from login
    group by 1, 2
) -- 每个用户的登陆日期表

# 查询所有信息
select *
# 查询要求信息
select a.date as date,
round(ifnull(count(distinct c.user_id) / count(distinct b.user_id), 0), 3) as p
from all_login_date a
left join reg b
on a.date = b.reg_date
left join log c
on b.user_id = c.user_id
and b.reg_date = date_sub(c.login_date, interval 1 day)
group by 1
order by 1

查询所有信息中的第一个 left join 结果(可求每个日期新用户的数量):
在这里插入图片描述

查询所有信息中的第二个 left join 结果:
在这里插入图片描述

查询要求信息的最终结果:
在这里插入图片描述

2.4 统计每天的日活数及新用户占比

① 建立两个表,表1 为每个用户的登录日期表,表2 为每个用户的注册日期表
② 以表1 为主表,与表2 进行 left join 的操作(注意,与计算次日留存率的两个表的位置是相互交换过的
③ 表1 与表2 的连接条件有 2 个:表1 中的 user_id = 表2 中的 user_id,且表1 中的用户登录日期 = 表2 中的用户注册日期
④ 按照表1 中的用户登录日期进行分组
注意: 计算这种题型时,用户登录日期表要放在最左侧作为主表,再左连接用户注册日期表

例4:查询牛客网每天的日活数及新用户占比

with reg as(
    select 
    uid, 
    date(min(in_time)) as reg_date
    from tb_user_log
    group by 1
), -- 用户注册表
log as(
    select
    uid,
    date(in_time) as login_date
    from tb_user_log
    union
    select
    uid,
    date(out_time) as login_date
    from tb_user_log
) -- 用户登陆表

select
*,
login_date,
count(distinct l.uid) as dau,
round(count(distinct r.uid) / count(distinct l.uid), 2) as uv_new_ratio
from log l
left join reg r
on l.uid = r.uid
and l.login_date = r.reg_date
group by 1
order by 1

查询要求信息的最终结果(无 group by,order by):
在这里插入图片描述

在这里插入图片描述

2.5 查询文章 / 直播间同一时刻最大浏览人数 / 最大观看人数

① 建立一个表,以统计每篇文章 / 每个直播间的不同时刻的人数增加和人数减少的情况,要用到 union all 语法(注意:要新增一列,每个时刻若人数增加则设为 1,若人数减少则设为 -1)
② 使用 sum 的窗口函数统计每篇文章 / 每个直播间同一时刻的浏览人数 / 观看人数(注意:以文章 ID / 直播间 ID 作为分区即可,并按照时刻升序排列,① 中新增的那一列降序排列)

例3:查询每篇文章同一时刻最大在看人数

with a as(
	select uid, artical_id, in_time as dt, 1 as is_in
    from tb_user_log
    union all
	select uid, artical_id, out_time as dt, -1 as is_in
    from tb_user_log
)

select artical_id, max(uv) as max_uv
from(
	select artical_id, dt,
	sum(is_in) over(partition by artical_id order by dt, is_in desc) as uv
	from a
    where artical_id <> 0
) b
group by 1
order by 2 desc

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1798105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署深度学习模型

基础概念 Docker Docker是一个打包、分发和运行应用程序的平台&#xff0c;允许将你的应用程序和应用程序所依赖的整个环境打包在一起。比如我有一个目标检测的项目&#xff0c;我想分享给朋友&#xff0c;那么他首先需要在自己的电脑上配置好显卡驱动、CUDA、CuDNN&#xff…

NC56 入库失败提示负库存解决方法

前言 公司的 NC ERP 接入了第三方系统进行出入库单据管理。用户反馈提交入库单据时、NC ERP 报错【负库存或辅数量方向不一致】。于是进行排查和解决。 操作环境 NC ERP V56 。操作系统 Windows 11 &#xff0c;数据库 Oracle DB 。 操作步骤 1、查询 NC “收发存汇总表”…

前端 | 燃尽图绘制

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f4da;模块实现解析 &#x1f407;html 搭框架<div id"LINE2"><div id"cloudtitle">TED…

抖音电商课程(持续更新...)

01 客户成交方式 1 直播间载体 冲动消费&#xff08;感性&#xff09; 团队配合好&#xff0c;主攻直播间。 客单价越高&#xff0c;对直播间的依赖性越强。进直播间建立强依赖关系。 2 短视频 / 图文载体 用户处于理性和感性之间。 擅长拍摄、擅长内容输出&#xff0c;…

搭建电商项目||购物商城||APP|小程序|电商独立站系统如何接入JD商品

京东商品采集的步骤和应用场景可以归纳如下&#xff1a; 一、采集步骤 注册账号&#xff1a;首先&#xff0c;需要在京东开放平台注册一个开发者账号。创建应用&#xff1a;登录开放平台后&#xff0c;创建一个应用以获取API密钥和应用凭据。获取权限&#xff1a;根据所需的服…

如何实现网站HTTPS访问

在当今网络安全至关重要的时代&#xff0c;HTTPS已经成为网站安全的基本标准。HTTPS&#xff08;超文本传输安全协议&#xff09;通过在HTTP协议基础上加入SSL加密层&#xff0c;确保了数据在用户浏览器和服务器之间的传输是加密的&#xff0c;有效防止数据被窃取或篡改&#x…

【画板案例-线宽 Objective-C语言】

一、接下来,我们来说这个,线宽, 1.示例程序里边,这个slider,是改变线宽的,在最左边的时候,我画一下, 是这种线宽,还是有一定宽度的啊,跟我们这个默认的,不是1像素, 然后,最右边呢,也是有一个宽度的, 然后呢,这个线宽,我就给它,最小值设置成5,最大值设置成3…

面试题react03

React事件机制&#xff1a; React的事件机制可以分为两个部分&#xff1a;事件的触发和事件的处理。事件的触发&#xff1a;在React中&#xff0c;事件可以通过用户与组件进行交互而触发&#xff0c;如点击、鼠标移动、键盘输入等。当用户与组件进行交互时&#xff0c;浏览器会…

服务器数据恢复—强制上线raid5阵列离线硬盘导致raid不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌2850服务器中有一组由6块SCSI硬盘组建的raid5磁盘阵列&#xff0c;linux操作系统ext3文件系统。 服务器故障&#xff1a; 服务器运行过程中突然瘫痪。服务器管理员检查阵列后发现raid5阵列中有两块硬盘离线&#xff0c;将其中一块硬盘进行…

底层穿透海银财富爆雷

吃瓜&#xff01;海银财富爆雷了&#xff0c;底层资产绝大多数子虚乌有&#xff0c;开设了N个影子公司&#xff0c;搞了规模超700亿元的“嵌套资金池”……让我们在“图”中穿透里面的故事和事故。 海银财富共计发行了465只产品&#xff0c;募集规模超过700亿元&#xff0c;我…

记录项目使用ts时引入js文件后导致项目运行空白问题

主要原因&#xff1a; 使用ts后开启了eslint检测&#xff0c;而js压缩文件引入的位置在eslint检测的文件内。导致eslint检测认为该文件为很大的文件&#xff0c;或eslint认为此文件内存在无法处理的语法结构等问题。 解决方法&#xff1a; 1、把文件移到eslint检测外的文件引入…

牛啊后续:如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)...

前言&#xff1a;下午有小伙伴要求&#xff0c;让我继续做个解析实体类注释信息的内容。所以我也顺便加入进来。以下开始正文实战操作&#xff1a; 项目需要勾选输出api文档文件。这样就可以让所有实体类的summary信息被写入到输出目录下。如果有多个xml文件也没关系&#xff0…

大厂AI团战高考作文,华师一附中特级教师这样打分

在人工智能的浪潮中&#xff0c; 人们不禁疑问&#xff1a; AI真的能超越人类吗&#xff1f; 这究竟是现实还是幻想&#xff1f; 我们将目睹一场前所未有的较量&#xff1a; 百度文心一言、阿里通义千问、 腾讯混元、字节豆包 四家国内顶尖互联网企业 精心打造的AI大模…

AI大模型:引领产业变革的新引擎

前言 随着ChatGPT的火爆出圈&#xff0c;AI人工智能的时代浪潮似乎真的已经来临。人们开始感受到AI技术的实际影响&#xff0c;并纷纷思考这一技术将如何重塑我们的世界。在国内&#xff0c;各大科技巨头已经纷纷布局AI大模型领域&#xff0c;意图在这一轮技术变革中抢占先机。…

【画板案例-画线 Objective-C语言】

一、接下来,我们来做这个画线的功能, 1.我们要在这个灰色的View上,去画线, 首先,我要用到的东西,一定是touchesBegan:touchesMoved: 这是一定要有的, 然后呢,我还要去画线,所以,也要用到drawRect: 这三个方法,是我一定要有的,我要去写代码,所以,要给它绑定…

生成纳秒级别的时间戳

问题 同步influxdb有些数据没有&#xff0c;不知道啥原因&#xff0c;后来百度发现时间需要唯一&#xff0c;毫秒还会重复&#xff0c;只能采用纳秒处理了 java实现 TimeStampUtils.java package com.wujialiang;/*** 获取纳秒值的工具类*/ public class TimeStampUtils {/…

使Obsidian 导出pdf含书签的解决方案

使用Better Export PDF第三方插件 GitHub - l1xnan/obsidian-better-export-pdf: Obsidian PDF export enhancement plugin 正确安装并开启后&#xff0c;在右侧栏中选择Better Export PDF导出 最后效果如下。 值得注意的是Better Export PDF插件与floating toc插件不兼容。

Python opencv读取深度图,网格化显示深度

效果图&#xff1a; 代码&#xff1a; import cv2 import osimg_path "./outdir/180m_norm_depth.png" depth_img cv2.imread(img_path, cv2.IMREAD_ANYDEPTH) filename os.path.basename(img_path) img_hig, img_wid depth_img.shape # (1080, 1920) print(de…

HQL面试题练习 —— 占据好友封面个数

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;腾讯。 1 题目 有两个表&#xff0c;朋友关系表user_friend&#xff0c;用户步数表user_steps。朋友关系表包含两个字段&#xff0c;用户id&#xff0c;用户好友的id&#xff1b;用户步数表包含两个字段&#xff0c;用户id&am…

Windows 系统安装 VisualSVN Server

一.下载 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服务器端要使用的软件,就是我们提交代码存在安装这个软件的电脑上,它将很多配置和服务直接帮你完成,简单好用容易上手。VisualSVN Server有三个版本,社区版免费但限15个用户,另有一般和‘企业’两个收费版本…