复杂SQL实践-MYSQL

news2024/11/28 9:40:34

MySQL 8.0窗口函数

MySQL从8.0版本开始支持窗口函数。

窗口函数总体上可以分为序号函数, 分布函数, 前后函数, 首尾函数和其他函数。

在这里插入图片描述

描述

题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。
在这里插入图片描述

示例1

drop table if exists `user_profile`;
drop table if  exists `question_practice_detail`;
drop table if  exists `question_detail`;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int 
);
CREATE TABLE `question_practice_detail` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL,
`date` date NOT NULL
);
CREATE TABLE `question_detail` (
`id` int NOT NULL,
`question_id`int NOT NULL,
`difficult_level` varchar(32) NOT NULL
);

INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong','2021-05-03');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong','2021-05-09');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong','2021-06-15');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right','2021-08-14');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(8,3214,112,'wrong','2021-05-09');
INSERT INTO question_practice_detail VALUES(9,3214,113,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(10,6543,111,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(11,2315,115,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(12,2315,116,'right','2021-08-14');
INSERT INTO question_practice_detail VALUES(13,2315,117,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(14,3214,112,'wrong','2021-08-16');
INSERT INTO question_practice_detail VALUES(15,3214,113,'wrong','2021-08-18');
INSERT INTO question_practice_detail VALUES(16,6543,111,'right','2021-08-13');
INSERT INTO question_detail VALUES(1,111,'hard');
INSERT INTO question_detail VALUES(2,112,'medium');
INSERT INTO question_detail VALUES(3,113,'easy');
INSERT INTO question_detail VALUES(4,115,'easy');
INSERT INTO question_detail VALUES(5,116,'medium');
INSERT INTO question_detail VALUES(6,117,'easy');

题意明确:

用户在某天刷题后第二天再来刷题的平均概率

问题分解:

  • 限定条件:第二天再来。

    • 解法1:表里的数据可以看作是全部第一天来刷题了的,那么我们需要构造出第二天来了的字段,因此可以考虑用left join把第二天来了的拼起来,限定第二天来了的可以用date_add(date1, interval 1 day)=date2筛选,并用device_id限定是同一个用户。
    • 解法2:用lead函数将同一用户连续两天的记录拼接起来。先按用户分组partition by device_id,再按日期升序排序order by date,再两两拼接(最后一个默认和null拼接),即lead(date) over (partition by device_id order by date)
  • 平均概率:

    • 解法1:可以count(date1)得到左表全部的date记录数作为分母,count(date2)得到右表关联上了的date记录数作为分子,相除即可得到平均概率。
    • 解法2:检查date2和date1的日期差是不是为1,是则为1(次日留存了),否则为0(次日未留存),取avg即可得平均概率。

细节问题:

  • 表头重命名:as
  • 去重:需要按照devece_id,date去重,因为一个人一天可能来多次
  • 子查询必须全部有重命名

完整代码:

select count(date2) / count(date1) as avg_ret
from (
    select
        distinct qpd.device_id,
        qpd.date as date1,
        uniq_id_date.date as date2
    from question_practice_detail as qpd
    left join(
        select distinct device_id, date
        from question_practice_detail
    ) as uniq_id_date
    on qpd.device_id=uniq_id_date.device_id
        and date_add(qpd.date, interval 1 day)=uniq_id_date.date
) as id_last_next_date

解法2:

select avg(if(datediff(date2, date1)=1, 1, 0)) as avg_ret
from (
    select
        distinct device_id,
        date as date1,
        lead(date) over (partition by device_id order by date) as date2
    from (
        select distinct device_id, date
        from question_practice_detail
    ) as uniq_id_date
) as id_last_next_date

重点讲解

重点1

select distinct device_id, date from question_practice_detail

device_id, date 一起去重,效果如下:
在这里插入图片描述

重点2

注意 on 后面的用法

select
        distinct qpd.device_id,
        qpd.date as date1,
        uniq_id_date.date as date2
    from question_practice_detail as qpd
    left join(
        select distinct device_id, date
        from question_practice_detail
    ) as uniq_id_date
    on qpd.device_id=uniq_id_date.device_id
        and date_add(qpd.date, interval 1 day)=uniq_id_date.date

效果如下:
在这里插入图片描述
如果把:

on qpd.device_id=uniq_id_date.device_id
        and date_add(qpd.date, interval 1 day)=uniq_id_date.date

改为:

on qpd.device_id=uniq_id_date.device_id
        where date_add(qpd.date, interval 1 day)=uniq_id_date.date

效果如下:
在这里插入图片描述
因为where会过滤掉不符合的记录。

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

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

相关文章

对远程http服务的拨测体验

背景: 过程是这样的,需要与合作方数据进行交互(肯定是不允许直接连对方数据源的),对方提供了两台server,后端同事在server上面作了proxy搭建了桥接的应用(两台server没有公网ip,通过…

Eclipse 教程Ⅹ

本次内容会涉及到Eclipse 重构菜单、Eclipse 添加书签和Eclipse 任务管理,老规矩,直接开始吧! Eclipse 重构菜单 使用Eclipse重构 在项目开发中我们经常需要修改类名,但如果其他类依赖该类时,我们就需要花很多时间去…

机器学习模型的生命周期

动动发财的小手,点个赞吧! 您的模型如何变化?Source[1] 诞生 当我们构建、训练、拟合或估计我们的模型时,这些数字工具就诞生了。这个阶段几乎从拥有分析目标、数据、计算机、算法以及数据科学家现在已经非常了解的其他一切开始。…

Linux [权限]

Linux 权限 Linux用户分类切换成root方法例子 切换成普通用户方法例子 短暂提权 什么是权限理论知识展示区域 修改权限(1)修改文件属性1. 采用 w/r/x的形式2. 采用八进制的形式 (2)修改身份1. 修改拥有者2. 修改所属组3. 修改拥有者 && 所属组 问题区问题1问题2问题3 L…

实在智能携手各高校打造高端数字化技能教育平台

百年大计,教育为本。2021年在《教育部办公厅关于印发高等职业教育专科英语、信息技术课程标准)的通知中把机器人流程自动化列入专科信息技术课程学习计划之中,进一步明确职业教育中数字化人才发展方向。 一、为什么要大力培养数字化人才&…

毕业5年的同学突然告诉我,他已经是年薪30W的自动化测试工程师,我愣住了...

作为一名程序员,都会对自己未来的职业发展而焦虑。一方面是因为IT作为知识密集型的行业,知识体系复杂且知识更新速度非常快,“一日不学就会落后”。 另外一方面,IT又是劳动密集型的行业,不仅业人员多,而且个…

随机梯度下降法

梯度下降法有两个比较大的缺点: --计算花时间 --容易陷入局部最优解 比如以下形状的函数,最优解取决于初始值的选取。 梯度下降法的表达式如下,这个表达式使用了所有训练数据的误差: 随机梯度下降法表达式: 在随机梯…

Cmake学习记录(九)--使用Cmake交叉编译.so库

文章目录 一、前言二、相关代码三、参考链接 一、前言 目前Android编译.so的话使用Android Studio比较简单,但是有时候时候Android Studio的话还需要创建一个Android的项目,这里记录下脱离Android Studio单纯使用Cmake和C开发工具Clion(或者其他的开发工…

Prometheus+grafana+node_exporter环境搭建

原理: node_exporter采集数据,Prometheus通过配置文件Prometheus.yml配置node_exporter信息获取采集到的数据并做展示,grafana将Prometheus作为数据源展示node_exporter采集到的数据 拓扑图 问题: 1)为什么不直接用…

万众瞩目的Nautilus Chain即将上线主网,生态正式起航

Zebec Protocol 是以流支付为定位 Web3 生态,该生态旨在构建一个全新的支付方式,以进一步丰富加密支付场景,并推动加密支付的大规模采用,该生态此前在 Solans 生态中曾取得了十分亮眼的成绩。目前,Zebec Protocol 正在…

Unity MVC实现背包系统(2)

在上一篇中,我们写了背包系统的伪代码,也说了mvc的设计思路,那么这一篇的任务就是将伪代码补全。 首先制作一个背包面板,我这里比较简单,就是一个滚动视图,还有一个提示文本,外加两个按钮&…

20230530论文整理·1-课题组1

个人观点,现在的NLP文章,有些是在做积木,微创新,有些文章,是可以的,读起来很美,有些,太过逆了,吃起来没味道,反胃。 文章目录 1.CODEIE: Large Code Generat…

【.NET AI Books】问题分类和技能使用大全

第一章 问题分类 我会把问题设定放在首位,也就是我们的第一章。毕竟所有生成式的 AI 都是需要基于问题给出答案。所以我一直不认同人工智能会取代人类,没有人类哪来问题呢? ChatGPT 的神奇之处在于它可以根据你的问题去完成不同的工作&…

【Python实战】Python采集C站热榜数据

前言 大家好,我们今天来爬取c站的热搜榜,把其文章名称,链接和作者获取下来,我们保存到本地,我们通过测试,发现其实很简单,我们只要简单获取数据就可以。没有加密的东西。 效果如下: 环境使用 python 3.9pycharm模块使用 requests模块介绍 requests requests是…

95后阿里P7架构师晒出工资单:狠补了这个,真香...

最近一哥们跟我聊天装逼,说他最近从阿里跳槽了,我问他跳出来拿了多少?哥们表示很得意,说跳槽到新公司一个月后发了工资,月入5万多,表示很满足!这样的高薪资着实让人羡慕,我猜这是税后…

阿里云的消息队列(MQ)服务如何帮助解决应用程序中的消息传递问题?

阿里云的消息队列(MQ)服务如何帮助解决应用程序中的消息传递问题?   [本文由阿里云代理商[聚搜云www.4526.cn]撰写]   随着企业应用程序的复杂性不断增加,消息传递在系统间的通信与协作中扮演着越来越重要的角色。本文将探讨阿里云的消息队列&#x…

Vue-组件的嵌套

组件的嵌套 组件的嵌套也是开发中比较常见的方式 一个大组件里面有多个小组件,大组件一般称为父组件,小组件称为子组件 1 编写案例 首先定义一个school组件 提出新的需求:现在我想在school里面定义一个子组件(student)出现 首先创建student组件&…

uni-app扩展组件(uni-ui)

目录 数字角标(uni-badge) 代码示例: 面包屑(uni-breadcrumb) 代码示例: 日历 代码示例 卡片(uni-card) 代码示例 倒计时(uni-countdown) 更多内容请访问官网 数字角标(uni-badge) 数字角标一般和其它控件(列表、9宫格等&#xff0…

网络编程--多线程服务器客户端

写在前面 此前的回声服务器/客户端都是在主线程中阻塞交互,本文将使用多线程方式实现服务器/客户端。 互斥量相关接口 使用多线程,自然避免不了线程同步问题。 因本文使用互斥量实现线程同步,因此仅介绍互斥量相关接口,其他实…

【MySQL高级篇笔记-索引的数据结构 (中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引及其优缺点 1、索引概述 2、优点 3、缺点 二、InnoDB中索引的推演 1、设计索引 1.一个简单的索引设计方案 2.InnoDB中的索引方案 2、常见索引概念 1. 聚簇索引 2. 二级索引(辅助索引、非聚簇索引&#…