[每日一练]制作会话柱状表图(使用with函数自建数据框,最后再进行分析)

#该题目来源于力扣:

1435. 制作会话柱状图 - 力扣(LeetCode)

一:题目要求:

表:Sessions

+---------------------+---------+
| Column Name         | Type    |
+---------------------+---------+
| session_id          | int     |
| duration            | int     |
+---------------------+---------+
session_id 是该表主键
duration 是用户访问应用的时间, 以秒为单位
 

你想知道用户在你的 app 上的访问时长情况。因此你决定统计访问时长区间分别为 "[0-5>","[5-10>","[10-15>" 和 "15 minutes or more" 的会话数量,并以此绘制柱状图。

写一个解决方案来报告 (bin, total) 。

返回结果 无顺序要求 。

结果格式如下所示。

 

示例 1:

输入:
Sessions 表:
+-------------+---------------+
| session_id  | duration      |
+-------------+---------------+
| 1           | 30            |
| 2           | 199           |
| 3           | 299           |
| 4           | 580           |
| 5           | 1000          |
+-------------+---------------+
输出:
+--------------+--------------+
| bin          | total        |
+--------------+--------------+
| [0-5>        | 3            |
| [5-10>       | 1            |
| [10-15>      | 0            |
| 15 or more   | 1            |
+--------------+--------------+
解释:
对于 session_id 1,2 和 3 ,它们的访问时间大于等于 0 分钟且小于 5 分钟。
对于 session_id 4,它的访问时间大于等于 5 分钟且小于 10 分钟。
没有会话的访问时间大于等于 10 分钟且小于 15 分钟。
对于 session_id 5, 它的访问时间大于等于 15 分钟。

二:思路流程

贸然进行判断会很麻烦,因为题中就给了一张表格,而需求却要返回一个经过聚合和判断的total和一个完全的新建列bin用来对total聚合列的判断。

要解决这个方法,可以自己用with函数新建两个数据框,第一个数据框是用casewhen判断函数组成的,用来判断原表格的duration属于哪个bin,第二个数据框是一个完全的新表,其中包括所有的判断项,将每一项用union函数进行连接。最后对自己的两个表格按照第二个数据框进行连接,然后按照bin进行分组,最后再进行聚合函数的判断即可。

第一步:

新建一个关于原表格的判断列,并且将其储存为一个名叫“b_bin”的数据框类型的变量:

WITH b_bin AS (
    SELECT 
        CASE 
            WHEN duration < 300 THEN '[0-5>'
            WHEN duration >= 300 AND duration < 600 THEN '[5-10>'
            WHEN duration >= 600 AND duration < 900 THEN '[10-15>'
            ELSE '15 or more' 
        END AS bin,
        session_id,
        duration
    FROM Sessions
)

接着再创建第二张包含所有判断项的表格,储存为数据框形式的变量,命名为b_list:

WITH b_bin AS (
    SELECT 
        CASE 
            WHEN duration < 300 THEN '[0-5>'
            WHEN duration >= 300 AND duration < 600 THEN '[5-10>'
            WHEN duration >= 600 AND duration < 900 THEN '[10-15>'
            ELSE '15 or more' 
        END AS bin,
        session_id,
        duration
    FROM Sessions
),
b_list as(
    SELECT '[0-5>' AS bin
    union
    SELECT '[5-10>' AS bin
    union
    SELECT '[10-15>' AS bin
    union
    select '15 or mor

第二步:

检查这两张表,然后再思考下一步的数据分析:

b.bin为
| bin        | session_id | duration |
| ---------- | ---------- | -------- |
| [0-5>      | 1          | 30       |
| [0-5>      | 2          | 199      |
| [0-5>      | 3          | 299      |
| [5-10>     | 4          | 580      |
| 15 or more | 5          | 1000     |
b.list为
| bin        |
| ---------- |
| [0-5>      |
| [5-10>     |
| [10-15>    |
| 15 or more |

 现在要求,将b.bin表格中的数据,按照bin进行统计聚合,然后显示出来。

这样,复杂的问题就简化为了一个简单的分组聚合问题:按照b.list表的bin分组,然后统计出来分组后的b.bin的数量,最后返回b.list的bin和b.bin的count函数即可

第三步

对简单的分组聚合问题的实现:

先将两张表按照b.list(包含所有判断项的自建表)进行连接,然后进行分组聚合的判断即可:

select b_list.bin,ifnull(count(duration),0) as total 
from b_list 
left join 
b_bin on b_bin.bin=b_list.bin
group by b_list.bin

三:最终代码演示

# Write your MySQL query statement below
WITH b_bin AS (
    SELECT 
        CASE 
            WHEN duration < 300 THEN '[0-5>'
            WHEN duration >= 300 AND duration < 600 THEN '[5-10>'
            WHEN duration >= 600 AND duration < 900 THEN '[10-15>'
            ELSE '15 or more' 
        END AS bin,
        session_id,
        duration
    FROM Sessions
),
b_list as(
    SELECT '[0-5>' AS bin
    union
    SELECT '[5-10>' AS bin
    union
    SELECT '[10-15>' AS bin
    union
    select '15 or more' as bin
)
select b_list.bin,ifnull(count(duration),0) as total 
from b_list 
left join 
b_bin on b_bin.bin=b_list.bin
group by b_list.bin

解法二:

我们可以通过if函数外边套sum函数进行判断: if函数判断duration 是否符合条件,符合返回1,不符合返回0,然后用sum进行累加,就可以通过对原始数据的0/1转换再聚合,实现一个简单的条件统计:

# Write your MySQL query statement below
SELECT 
    '[0-5>' AS bin,
    IFNULL(SUM(IF(duration < 300, 1, 0)), 0) AS total 
FROM 
    Sessions;
/*可见第一个条件行已经被创建出来了
| bin   | total |
| ----- | ----- |
| [0-5> | 3     |*/

如法炮制,船舰其他的判断语句,然后用union连接语句全部连起来就行,比较繁琐,但思路简单

# Write your MySQL query statement below
SELECT 
    '[0-5>' AS bin,
    IFNULL(SUM(IF(duration < 300, 1, 0)), 0) AS total 
FROM 
    Sessions
union
SELECT 
    '[5-10>' AS bin,
    IFNULL(SUM(IF(300<=duration and duration<600,1,0)),0) AS total 
FROM 
    Sessions
union
SELECT 
    '[10-15>' AS bin,
    IFNULL(SUM(IF(600<=duration and duration<900,1,0)),0) AS total 
FROM 
    Sessions
union
SELECT 
    '15 or more' AS bin,
    IFNULL(SUM(IF(900<=duration,1,0)),0) AS total 
FROM 
    Sessions    

注意,再if判断函数里,不可以写成600<=duration<900类似的形式,会判断失误。要用if函数自带的连接函数and就像连接:600<=duration and duration<900

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

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

相关文章

“蜀道山”高校联合公益赛 Web (部分)

文章目录 奶龙牌WAF海关警察训练平台恶意代码检测器 奶龙牌WAF <?php if ($_SERVER[REQUEST_METHOD] POST && isset($_FILES[upload_file])) {$file $_FILES[upload_file];if ($file[error] UPLOAD_ERR_OK) {$name isset($_GET[name]) ? $_GET[name] : basen…

【JavaEE初阶 — 网络原理】初识网络原理

目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…

Linux的介绍及虚拟机centOS系统的下载与应用

1、什么是Linux Linux 是一种类 Unix 操作系统&#xff0c;它的内核&#xff08;Kernel&#xff09;由 Linus Torvalds 于 1991 年首次发布。作为一个开源、免费的操作系统&#xff0c;Linux 被广泛用于服务器、桌面计算机、嵌入式设备、移动设备等各种场景。 1、操作系统 操…

Leetcode打卡:交替组II

执行结果&#xff1a;通过 题目&#xff1a;3208 交替组II 给你一个整数数组 colors 和一个整数 k &#xff0c;colors表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] &#xff1a; colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。colors[i] 1 …

【ONE·基础算法 || 动态规划(二)】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解动态规划类题型&#xff08;子数组、子序列问题&#xff09;。                文章目录 总言5、子数组问题&#xff08;数组中连续的一段&#xff09;5.1、最大子数组和&#xff08;medium&#xff09;5.1.…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api&#xff0c;通过抓api的包&#xff0c;得到关键字。 例如&#xff1a;关键字&#xff1a;x-sap-ri 我们得到想要的关键字后&#xff0c;通过拦截 类&#xff0c;寻找我们的关键字&#xff0c;及找到发包收包的位置&#xff0c…

MFC图形函数学习12——位图操作函数

位图即后缀为bmp的图形文件&#xff0c;MFC中有专门的函数处理这种格式的图形文件。这些函数只能处理作为MFC资源的bmp图&#xff0c;没有操作文件的功能&#xff0c;受限较多&#xff0c;一般常作为程序窗口界面图片、显示背景图片等用途。有关位图操作的步骤、相关函数等介绍…

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近&#xff0c;钟睒睒关于绿瓶水不适合长期饮用的言论&#xff0c;在网上引起了一番新的热议&#xff0c;让刚平静不久的包装饮用水竞争&#xff0c;再次掀起一阵波澜&#xff0c;同时&#xff0c;其对于企业家直播带货的等系列看法&#xff0c…

比亚迪降价令背后的反思,创新还是压榨?

科技新知 原创作者丨依蔓 编辑丨蕨影 比亚迪要求供应商明年起降价10%&#xff1f; 近日&#xff0c;网传一封有关比亚迪乘用车要求供应商降价的邮件&#xff0c;署名为比亚迪集团执行副总裁、乘用车首席运营官何志奇。 邮件称&#xff0c;2025年市场竞争将更加激烈&#xff0…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; 视频图片生成器 一个基于 Python 和 Web 的工具&#xff0c;用于生成带有文字和语音的视频以及图片。支持多种尺寸、…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前&#xff0c;请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

逻辑处理器核心指纹修改

navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义&#xff1a; third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…

Linux下的火墙管理及优化

从功能角度来讲 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) 通过netfiler来管理kernel space中的策略 netfilter简介 Netfilter是Lin…

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。

【Vue】Ego商城项目跟做

技术栈 Vue全家桶&#xff1a;Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求&#xff1a;npm install --save axios --no-fund Element&#xff1a;vue add element 后端相关依赖&#xff1a;npm install --save express cors mysql --no-fund token&#xff1a;np…

ALSA(4) --- CPU DAI实践

CPU_DAI实践 物理拓扑图 上图可知&#xff0c;从dma过来数据&#xff0c;会保存在DAI的一个FIFO队列中&#xff0c;数据是并行过来的各个通道数据&#xff0c;经过shift移位寄存器&#xff0c;再经过P2S并行转串行&#xff0c;再经过DAVC音量控制输出到GPIO端口 音频数据接口…

【开篇】.NET开源 ORM 框架 SqlSugar 系列

01. 前言 ☘️ 1.1 什么是ORM? 对象-关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对…

EtherCAT Coe对象创建与通信

目录 前言使用SSC工具生成XML填充读写函数测试 前言 EtherCAT协议栈生成参考https://blog.csdn.net/qq_42039294/article/details/144061669 本文默认大家有EtherCAT基础的移植经验 使用SSC工具生成XML 首先确保COE是开启的 打开表格&#xff0c;编辑内容如下 更多的数据类…

Axure农业农村数据可视化大屏模板分享

在当今信息技术飞速发展的时代&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;凭借其高度的自定义能力和丰富的交互设计功能&#xff0c;在农业农村数据可视化领域展现出强大的潜力。本文将详细介绍A…