瑶池数据库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 ) < 2ORDER 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 tLEFT 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 tLEFT 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 tLEFT 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 tLEFT 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.014SELECT 14/1000;

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

解题感受

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

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

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

相关文章

1.1 离散信号的时域分析

目录 基本离散信号 单位脉冲序列δ[k] 单位阶跃序列u[k] 矩形序列Rn[k] 实指数序列x[k] 虚指数序列和正弦序列x[k] 基本运算 翻转 位移 抽取 内插 卷积 相关 DSP&#xff08;Digital Signal Processing&#xff09; 数字信号处理 基本离散信号 单位脉冲序…

目标检测系列(四)利用pyqt5实现yolov8目标检测GUI界面

目录 1、pyqt5安装 2、PyCharm添加Qt Designer、PyUIC 3、Qt Designer设计界面 4、根据ui文件自动生成py文件 5、修改py文件来调用检测程序 6、执行py文件启动 1、pyqt5安装 Qt Designer&#xff1a;一个用于创建图形用户界面的工具&#xff0c;可轻松构建复杂的用户界面…

还在花钱做数据可视化?为大家推荐一款免费可视化工具

在当今数据驱动的世界里&#xff0c;数据可视化已经成为不可或缺的工具&#xff0c;帮助我们更好地理解和分析信息。然而&#xff0c;许多企业和个人仍在为昂贵的可视化软件买单&#xff0c;承受着高昂的费用和复杂的操作流程。因此&#xff0c;作为一个经常接触数据可视化的相…

php聚合快递寄快递小程序

一、引言&#xff1a;告别传统寄件&#xff0c;拥抱便捷新选择 在数字化时代&#xff0c;我们越来越追求便捷和高效。传统的寄件方式已经无法满足现代人快速、便捷的需求。因此&#xff0c;一款聚合快递优惠寄件小程序应运而生&#xff0c;它集合了多家快递公司&#xff0c;为…

信创产业生态圈各企业分布

文章目录 应用系统&#xff1a;办公管理&#xff1a;云平台网络安全基础软件操作系统数据库中间件 基础硬件芯片 我们国家在前几年提出了信创战略计划&#xff0c;就是为了在信息技术领域&#xff0c;将一些国外牌子的设备和应用、软件逐渐替换成国产的&#xff0c;保证国家的金…

综合布线实训室建设可行性报告

1、 建设综合布线实训室的目的和意义 1.1 响应国家职业教育政策 在国家对职业教育的高度重视和政策支持下&#xff0c;综合布线实训室的建设不仅是对国家教育方针的积极响应&#xff0c;也是对技术教育改革的有力推动。通过这一平台&#xff0c;我们旨在培育出一批具有强烈实…

mac app应用程序如何自定义图标, 更换.app为自己喜欢的图标或者图片 详细图文讲解

在mac系统中&#xff0c;我们可以对任何的app应用程序更换或者自定义图标&#xff0c; 这个图标可以是拥有的app的图标&#xff0c;或者是你自己制作的 x.icns 图标 或者是 任意的图片&#xff0c; 建议大小512x512 。 自定义图标方法如下&#xff1a; 1. 更换为已有app的图标…

倒计时日期 桌面倒数日 重要日期倒计时提醒

在工作、学习、生活中&#xff0c;我们往往会有很多重要的日子需要我们去标记。在工作中的季度考核、学习中的关键时间点、生活中的各种纪念日……等等&#xff0c;都需要我们去对未来这些重要的时间节点做一个倒计时提醒。 日期倒计时让我们对未来的时间&#xff0c;有一个非…

【深度学习】基于深度离散潜在变量模型的变分推理

1.引言 1.1.讨论的目标 阅读并理解本文后&#xff0c;大家应能够&#xff1a; 掌握如何为具有离散潜在变量的模型设定参数在可行的情况下&#xff0c;使用精确的对数似然函数来估计参数利用神经变分推断方法来估计参数 1.2.导入相关软件包 # 导入PyTorch库&#xff0c;用于…

揭秘Soundex算法:解锁声音背后的数字密码

文章目录 引言一、Soundex算法简介二、Soundex算法的工作原理1.预处理2.初始化3.编码转换4.补齐编码5.匹配计算6.判断相似得分 三、算法实现代码Demo四、Soundex算法的应用场景五、Soundex算法的局限性总结 引言 在信息爆炸的今天&#xff0c;数据处理和检索成为了我们日常生活…

处理key value数据

循环以上数据 <u-popup :round"10" :show"tab OilType" close"close" mode"bottom"><view class"container"><view v-for"(allData, allType) in allList" :key"allType"><view …

注意!流量卡的禁区并不一样,请看清楚后再下单!

大家好&#xff0c;我是搜卡之家&#xff0c;今天我又来给大家科普了&#xff01; 今天科普的内容是关于流量卡禁区&#xff01; 首先要说一下&#xff0c;流量卡为什么会有禁区&#xff1f;运营商设立禁区主要是为了应对电信诈骗和违法使用电话卡的行为&#xff0c;确保网络…

Web应用和Tomcat的集成鉴权2-Form Authentication

作者:私语茶馆 1.相关章节 1) Web应用和Tomcat的集成鉴权1-BasicAuthentication-CSDN博客 2) Web应用和Tomcat的集成鉴权2-Form Authentication-CSDN博客 集成鉴权+定制化登录 2.前言 上章讲述了Tomcat的Basic Authentication鉴权模式,可以让Web应用和Tomcat的鉴权集成起来…

【Flink metric(1)】Flink指标系统的系统性知识:获取metric以及注册自己的metric

文章目录 一. Registering metrics&#xff1a;向flink注册新自己的metrics1. 注册metrics2. Metric types:指标类型2.1. Counter2.2. Gauge2.3. Histogram(ing)2.4. Meter 二. Scope:指标作用域1. User Scope2. System Scope ing3. User Variables 三. Reporter ing四. System…

面试题-Java垃圾回收之垃圾收集器

1.基础知识 (1)知识点补充 Stop -the -World:发生时&#xff0c;除了GC所用的线程之外&#xff0c;所有的线程都处于等待状态 Safepoint: 可达性分析算法时&#xff0c;必须保证在某个快照点进行。 分析的过程中对象的引用关系不会发生变化&#xff01; JVM的运行模式&#x…

数据结构-分析期末选择题考点(排序)

何似清歌倚桃李 一炉沈水醉红灯 契子 ✨ 上一期给大家提供了大概会考的题型给老铁们复习的大致思路 这一期还会是一样&#xff0c;我将整理一下排序的题型以及解题方法给你们 由于时间还很多&#xff0c;我就慢慢总结吧&#xff0c;一天一章的样子&#xff0c;明天总结串、后天…

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

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

微前端框架是为了解决项目应用在大型项目中带来的复杂性和维护难题而提出的技术方案。

微前端框架是为了解决单页应用&#xff08;SPA&#xff09;在大型项目中带来的复杂性和维护难题而提出的技术方案。Qiankun.js、MicroApp 和 Wujie 是三种流行的微前端框架。以下是对这三种框架的优缺点分析&#xff1a; Qiankun.js 优点 成熟度高&#xff1a;Qiankun.js 基…

【知识学习】阐述Unity3D中FogLOD的概念及使用方法示例

在Unity3D中&#xff0c;Fog&#xff08;雾效&#xff09;和LOD&#xff08;Level of Detail&#xff0c;细节层次&#xff09;是两种用于提高场景视觉效果和性能的技术。 Fog&#xff08;雾效&#xff09; 雾效是一种视觉效果&#xff0c;用于模拟大气中的雾或烟&#xff0c…

YOLOv8数据集标注

1 简介 数据集是必不可少的部分&#xff0c;数据集的优劣直接影响训练效果。一般来说&#xff0c;一个完整的数据集应该包括训练集、测试集和验证集。通常&#xff0c;数据集会被划分为训练集和测试集&#xff0c;比如将数据集的70%用作训练集&#xff0c;30%用作测试集。在进行…