瑶池数据库SQL-问题二的解决方案

瑶池数据库SQL-问题二的解决方案

  • 为什么选问题二
  • 问题二
  • 准备工作
  • 解决方案
    • 第一步
    • 第二步
    • 初步尝试
    • 再次尝试
    • 主表自关联
    • 查询满足条件数据
  • 解题感受

为什么选问题二

个人没有详细的看三个题目的具体内容,只是看了三个题目的题目名称,
在这里插入图片描述
最后觉得问题二比较有意思,然后就选择了问题二进行解答。

问题二

首先来看一下阿里云数据库SQL挑战赛赛题二:游戏游玩情况的问题描述,首先有一张表,表名Activity
在这里插入图片描述
表中的字段就是以上四个字段,建表语句

CREATE TABLE `Activity` (

  `player_id` int(11) NOT NULL,

  `device_id` int(11) NOT NULL,

  `event_date` date NOT NULL,

  `games_played` int(11) NOT NULL,

  PRIMARY KEY (`player_id`,`event_date`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这张表的业务就是记录某些游戏的玩家的活动情况。每一行是一个玩家在指定日期的游玩记录,包含了设备信息,以及总共玩了多少款游戏。那么问题二来了,问:【注册首周内至少有两次登录的玩家占总玩家的比例,四舍五入到小数点后两位】

准备工作

个人的阿里云账号已经没有试用资格了,只能在我自己的本地数据库测试了,然后下载了为赛题准备的数据集,先在本地数据库建表
在这里插入图片描述
然后通过数据库连接工具navicat 导入数据,导入数据的具体步骤这里就不再演示了,直接看导入数据后的结果
在这里插入图片描述

解决方案

数据导入之后,就可以开始着手分析问题了,根据题目要求,查询【注册首周内至少有两次登录的玩家占总玩家的比例,四舍五入到小数点后两位】,那么问题应该分为两步处理:
1.获取当前表中总玩家数;
2.获取当前表中注册首周内至少有两次登录的玩家数;
分析完成之后我们开始按步骤处理,查询对应的数据。

第一步

首先需要查询当前表中总玩家数,查询语句

SELECT COUNT(DISTINCT player_id) FROM Activity;

执行结果
在这里插入图片描述
可以看到总玩家数量是1000;

第二步

首先我们先观察一下数据结构
在这里插入图片描述
可以看到相同player_id下event_date默认就是升序排列的,那么我们就不用再单独进行升序来获取注册时间了。下面我们只需要获取每一个player_id的前两条记录,并且比较这两条记录的event_date是否在一周内,那么这样统计出来的数据就是【注册首周内至少有两次登录记录的玩家数了】。

初步尝试

考虑到这里需要取每个player_id下的前面两条记录,那么我们可以写sql

SELECT t.player_id,t.event_date FROM Activity t WHERE

  ( SELECT COUNT(*) FROM Activity t1 WHERE t1.player_id = t.player_id AND t1.event_date < t.event_date ) < 2

ORDER BY t.player_id;

执行结果如图
在这里插入图片描述
根据执行结果可以看到我们是获取了每个player_id下面的前面两条记录,但是在此基础上再进行event_date日期的比较在一周内的话难以执行,那么又想了另外一种方案。

再次尝试

对于上面无法进行event_date日期比较的境况,后来又考虑了一种方向,既然要进行event_date日期字段的比较,那么首先要确保当前player_id下的两条记录是在一条记录上,那么后续通过比较event_date日期字段是否在一周内就可以直接判断当前player_id是满足条件的数据了。那么下面就按这个思路来写sql。

主表自关联

首先主表自关联,将后续的时间都挪到上一条记录的后面,方便后续进行event_date日期字段的比较

SELECT t.player_id,t.event_date,t1.event_date event_date2 FROM Activity t

LEFT JOIN Activity t1 ON t.player_id=t1.player_id;

执行结果如图
在这里插入图片描述
这里可以看到我们想要的数据已经出现了,这个时候其实只要GROUP BY t.player_id就可以每个player_id 下获取一条数据,但是目前的sql获取的是第一条

1 2015-02-14  2015-02-14

这样的数据,并不是我们想要的第二条符合要求的数据,那么我们可以排除第一条数据就可以了,改写sql,同时直接加上GROUP BY t.player_id

SELECT t.player_id,t.event_date,t1.event_date event_date2 FROM Activity t

LEFT JOIN Activity t1 ON t.player_id=t1.player_id AND t.event_date != t1.event_date GROUP BY t.player_id;

执行结果如图
在这里插入图片描述
这样我们就得到了按player_id分组,并且前两次登录的时间在同一行数据的结果了,下面只需要对当前数据按照event_date进行比较就可以得到【当前表中注册首周内至少有两次登录的玩家】

查询满足条件数据

根据上面的分析我们继续改写sql

SELECT * FROM (

SELECT t.player_id,t.event_date,t1.event_date event_date2 FROM Activity t

LEFT JOIN Activity t1 ON t.player_id=t1.player_id AND t.event_date != t1.event_date GROUP BY t.player_id ) t2 

WHERE TIMESTAMPDIFF(DAY,t2.event_date,t2.event_date2) < 7;

执行结果如图
在这里插入图片描述
这里我们就可以看到所有满足【当前表中注册首周内至少有两次登录的玩家】条件的玩家了,下面统计数量的话把查询字段的换成COUNT()即可

SELECT COUNT(*) FROM (

SELECT t.player_id,t.event_date,t1.event_date event_date2 FROM Activity t

LEFT JOIN Activity t1 ON t.player_id=t1.player_id AND t.event_date != t1.event_date GROUP BY t.player_id ) t2 

WHERE TIMESTAMPDIFF(DAY,t2.event_date,t2.event_date2) < 7;

执行结果如图
在这里插入图片描述
那么整个问题二到这里也就结束了,问题二的结果就是

-- 0.014

SELECT 14/1000;

结果如图
在这里插入图片描述
到这里整个问题二的解答就完工了。

解题感受

最初是因为对这个题的名称比较敢兴趣,后来点进去看了题目详细内容之后,就更有兴趣了,工作中由于工作方向的不同,不太容易遇到类似的场景,因此刚开始解题确实绕路了。这里就不再写出来了,毕竟绕路不是什么开心的事哈。
为什么觉得这个是经典SQL,过去的业务逻辑,写sql的话有时候一时想不起来的,基本上没多久也就写完了,这次写SQL,如果对数据结构没有分析到位的话,还是很容易绕路的,比较有误导性,当时当你绕到正路上的时候,你再看这个SQL又回觉得特别简单,没什么难度。其实这就是写SQL的乐趣,需要针对需求,结合数据结构深入分析,才能快速完成业务功能,完成之后回头再看又比较简单,哈哈。以上就是个人解题感悟,敬请指导。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本安防爆手机为什么能在石油化工行业使用

本安防爆手机专为石油化工行业等易燃易爆环境设计&#xff0c;具备严格的防爆安全标准和环境适应性&#xff0c;确保在石油化工厂的作业安全使用。这些手机不仅具备普通手机的通讯功能&#xff0c;更能有效防止电火花等潜在点火源的产生&#xff0c;为石油化工工作人员提供可靠…

阿里1688商家数据采集软件

大镜山阿里1688商家数据采集一款采集阿里巴巴1688.com商家数据的软件&#xff0c;采集的数据包括店铺名称、联系人姓名、手机号码等。 一、大镜山阿里1688商家数据采集特色 — 大镜山阿里1688商家数据采集一款采集阿里巴巴1688.com商家数据的软件&#xff0c;采集的数据包括店…

【JavaScript】一键入门

目录 一、JS起源 二、JS特点 三、JS组成部分 四、JS引入方式 一、JS起源 Java Script是由网景公司的Live Script发展而来的一种运行在客户端浏览器上的脚本语言&#xff0c;可以实现网页如文本内容、数据动态变化和动画特效等即浏览器与用户交互的这种体验。 二、JS特点 …

强化学习详解:理论基础与核心算法解析

本文详细介绍了强化学习的基础知识和基本算法&#xff0c;包括动态规划、蒙特卡洛方法和时序差分学习&#xff0c;解析了其核心概念、算法步骤及实现细节。 关注TechLead&#xff0c;复旦AI博士&#xff0c;分享AI领域全维度知识与研究。拥有10年AI领域研究经验、复旦机器人智能…

MySQL的安装与配置

MySQL提供安装包和压缩包两种安装方式&#xff0c;安装包是以.msi作为后缀名的二进制分发文件&#xff0c;压缩包是以.zip为后缀的压缩文件。安装包的安装只要双击安装文件&#xff0c;然后按照提示一步步安装就可以了&#xff0c;属于“傻瓜”式安装&#xff1b;压缩包的安装需…

成都百洲文化传媒有限公司专业电商服务的典范

在电商风起云涌的时代&#xff0c;成都百洲文化传媒有限公司凭借其深厚的行业经验和独特的创新思维&#xff0c;成为了众多品牌电商之路上的得力助手。今天&#xff0c;就让我们一起走进成都百洲文化传媒&#xff0c;看看他们是如何在电商领域乘风破浪&#xff0c;助力品牌实现…

新能源、新智造、新技术、新未来​ 2024常州国际新能源汽车产业博览会​ 9月20-22日盛大举行!

深入贯彻党的二十大关于制造强国建设、推动汽车产业高端化、制造化、绿色化发展的战略部署&#xff0c;构建新发展格局、推动高质量发展的内在要求。在“双碳”政策背景下&#xff0c;常州市紧扣“国际化智造名城、长三角中轴枢纽”城市定位&#xff0c;奋力推进“532”发展战略…

MyBatis源码分析--一级缓存、二级缓存原理

前言&#xff1a; 有点项目经验的朋友都知道缓存的重要性是不言而喻的&#xff0c;不仅仅我们在开发项目业务功能的时候使用了各种缓存&#xff0c;框架在设计的时候也有框架层面的缓存&#xff0c;尤其在查询多的场景下&#xff0c;缓存可以大大的减少数据库访问&#xff0c;…

valgrind调试c/c++内存问题:非法地址访问_内存泄漏_越界访问

1.valgrind命令 调试内存问题: valgrind --leak-checkfull 更新详细的显示: valgrind --leak-checkfull --show-leak-kindsall valgrind提示信息汇总 内存泄漏 lost in loss record 丢失记录 , 内存泄漏实例[[#2.内存泄漏–不完全释放内存|实例链接]]段错误 Process termina…

vue3-cropperjs图片裁剪工具-用户上传图片截取-(含预览视频)

效果图 上传图片弹窗预览 对于这个上传图片样式可以参考 官方原代码 官网传送入口 Upload 上传 | Element Plus (element-plus.org) <template><el-uploadclass"upload-demo"dragaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6…

吴恩达LangChain教程:Embedding与文档解析

当前有很多应用想要实现根据文档或者文本内容实现用户问答&#xff0c;或者实现多轮会话能力&#xff0c;这时候就会使用到Embedding的能力。 01 | 使用类介绍 想要依据Embedding实现文本检索&#xff0c;需要引入如下的依赖。 其中&#xff0c;RetrievalQA的作用是对一些文档…

一天跌20%,多只可转债“腰斩”,近百只跌破面值,“退可守”的香饽饽为何破防?

专业人士指出&#xff0c;近期部分可转债大跌原因主要有两点&#xff1a;一方面&#xff0c;转债市场与权益市场联动性强。另一方面&#xff0c;近期公布的宏观经济数据稳中趋缓&#xff0c;“供强需弱”特征依然明显&#xff0c;证监会主席吴清发言及“科创板八条”新规延续了…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构&#xff08;concrete data structures&#xff09;&#xff1b;优先级队列 priority queue 是一种抽象的数据结构&#xff08;abstract data structures&#xff09;&…

秘籍来啦!手机找回删除的文件,掌握这3种方法

你是否曾经不小心删除了手机上的重要文件&#xff0c;如照片、视频、文档等&#xff0c;然后束手无策&#xff0c;不知道该如何恢复&#xff1f;这时候&#xff0c;找回删除的文件就显得尤为重要。别担心&#xff0c;本文将为大家揭秘3种方法&#xff0c;让你轻松找回那些被删除…

Redis Stream Redisson Stream

目录 一、Redis Stream1.1 场景1&#xff1a;多个客户端可以同时接收到消息1.1.1 XADD - 向stream添加Entry&#xff08;发消息 &#xff09;1.1.2 XREAD - 从stream中读取Entry&#xff08;收消息&#xff09;1.1.3 XRANGE - 从stream指定区间读取Entry&#xff08;收消息&…

徐徐拉开的帷幕:拜登与特朗普的辩论大戏 日元跌破160大关!创1986年以来最低纪录

北京时间6月27日&#xff08;本周五&#xff09;上午9:00&#xff0c;拜登和特朗普将参加2024年总统候选人电视辩论。作为参考&#xff0c;2016年大选辩论期间&#xff0c;美元汇率对辩论结果的反应相对温和&#xff0c;希拉里胜选预期增强在一定程度上支撑了美元。 时间逐渐临…

AI产品打造全攻略:看我是如何预测用户流失,搞定AI产品全流程的

前言 对于任何互联网公司而言&#xff0c;用户流失无疑是一个不容忽视的问题。在本文中&#xff0c;我将通过一个真实的预测用户流失的项目案例&#xff0c;带领大家深入了解AI产品从筹备到上线的整个流程。这个过程将展现AI产品经理的工作全貌&#xff0c;包括各个环节的角色…

钉钉在MAKE 2024大会上宣布开放AI生态;NBC将用AI主播播报巴黎奥运会内容

&#x1f680; 钉钉在MAKE 2024大会上宣布开放AI生态 摘要&#xff1a;钉钉总裁叶军在MAKE 2024生态大会上宣布&#xff0c;钉钉将对所有大模型厂商开放&#xff0c;构建“国内最开放AI生态”。目前已有六家大模型厂商接入钉钉&#xff0c;用户可直接使用七家大模型产品。未来…

下拉选择输入框(基于elment-ui)

最近在需求中&#xff0c;需要有一个下拉选择功能&#xff0c;又得可以输入&#xff0c;在 element-ui 官网找了&#xff0c;发现没有适合的&#xff0c;然后在修炼 cv 大法的我&#xff0c;也在网上看了一下&#xff0c;但是也都感觉不合适&#xff0c;所以就自己写了一个&…

R语言数据分析案例37-旅游景点聚类分析

一、研究背景 近年来&#xff0c;随着旅游业的迅猛发展&#xff0c;旅游景点的竞争日益激烈。如何在众多景点中脱颖而出&#xff0c;吸引更多游客&#xff0c;成为各大景点管理者关注的焦点。通过对旅游景点进行深入的数据分析&#xff0c;可以帮助管理者更好地了解景点的优势…