每日HiveSQL_求解运动员最大连胜的次数_15

1.现需要从运动员比赛结果表中统计每个运动员最大连胜的次数

需求结果:

2.所用到的表和数据

--表创建
CREATE TABLE athlete_results
(athlete_id INT,match_time TIMESTAMP,result     VARCHAR(10) -- 'win', 'lose', 'draw'
);--数据装载
INSERT INTO athlete_results
VALUES (1, '2023-11-01', 'win'),(1, '2023-11-02', 'win'),(1, '2023-11-03', 'lose'),(1, '2023-11-04', 'win'),(1, '2023-11-05', 'draw'),(1, '2023-11-06', 'win'),(1, '2023-11-07', 'win'),(1, '2023-11-08', 'win'),(2, '2023-11-01', 'win'),(2, '2023-11-02', 'lose'),(2, '2023-11-03', 'draw'),(2, '2023-11-04', 'win'),(2, '2023-11-05', 'win'),(2, '2023-11-06', 'win');

3.答案

解析:由结果可知,此结果是对每个运动员进行分组得到的每个运动员的最大连胜数,此题关键在于如何根据特定的分组条件进行分组,得到每个可以代表运动员和比赛结果的分组字段。
思路一:

首先使用row_number()开窗根据运动员id进行分区,日期进行排序得到分组字段rn1,row_number()开窗根据运动员id和比赛结果进行分区,日期进行排序得到分组字段rn2,如下图rn1 - rn2可以唯一表述每个运动员在一次连续胜利、失败、平局的分组字段。

3.1 使用row_number()开两个窗,一个根据运动员id分区,日期升序排序,得到group1,另一个是根据运动员id和比赛结果进行分区,日期升序排序,得到group2
select athlete_id,to_date(match_time)                                                              match_time,result,row_number() over (partition by athlete_id order by to_date(match_time))         group1,row_number() over (partition by athlete_id, result order by to_date(match_time)) group2
from athlete_results;

运行结果: 

3.2筛选出比赛结果为”win“,然后再根据运动员id和win_group(group1 - group2)分组,count(*)得到运动员每个分组阶段的连胜次数
select athlete_id,group1 - group2 win_group,count(*)        win_count
from (select athlete_id,to_date(match_time)                                                              match_time,result,row_number() over (partition by athlete_id order by to_date(match_time))         group1,row_number() over (partition by athlete_id, result order by to_date(match_time)) group2from athlete_results) t
where result = 'win'
group by athlete_id, group1 - group2;

运行结果:

3.3最后根据以上运行结果根据运动员id进行分组得到最终结果
select athlete_id,max(win_count) max_win_count
from (select athlete_id,group1 - group2 win_group,count(*)        win_countfrom (select athlete_id,to_date(match_time)                                                              match_time,result,row_number() over (partition by athlete_id order by to_date(match_time))         group1,row_number() over (partition by athlete_id, result order by to_date(match_time)) group2from athlete_results) twhere result = 'win'group by athlete_id, group1 - group2) t
group by athlete_id;

运行结果: 

思路二: 

思考打破连续胜利的条件,仔细思考可知,一个运动员每次失败或者平局都会开启一个新的分组,怎么描述这个分组呢?很容易可以想到sum(if())结构,如下图 

3.1使用sum(if())开窗得到分组字段win_group
select athlete_id,to_date(match_time) match_day,result,sum(if(result = 'lose' or result = 'draw', 1, 0))over (partition by athlete_id order by to_date(match_time)) win_group
from athlete_results;

运行结果:

3.2根据以上结果筛选出result = ‘win’的结果,之后进行根据运动员id和win_group分组,count(*)得到连胜的次数。
select athlete_id,count(*) win_count
from (select athlete_id,result,sum(if(result = 'lose' or result = 'draw', 1, 0))over (partition by athlete_id order by match_time) win_groupfrom athlete_results) t
where result = 'win'
group by athlete_id, win_group;

运行结果:

3.3根据运动员id进行分组,得到最终结果
select athlete_id,max(win_count) max_win_count
from (select athlete_id,count(*) win_countfrom (select athlete_id,result,sum(if(result = 'lose' or result = 'draw', 1, 0))over (partition by athlete_id order by match_time) win_groupfrom athlete_results) twhere result = 'win'group by athlete_id, win_group) t
group by athlete_id;

运行结果:

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

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

相关文章

GBASE南大通用 GCDW阿里云计算巢:自动化部署云原生数据仓库

目前,GBASE南大通用已与阿里云计算巢合作,双方融合各自技术优势,助力企业用户实现云上数据仓库的自动化部署,让用户在云端获取数据仓库服务“更简单”,让用户在云端使用数据仓库服务“更便捷”,满足企业用户…

金融追梦者,向着春天出发——社科院与美国杜兰大学金融管理硕士

随着时代的进步和社会的变迁,教育已经不再是单纯的学生时代的事情,而是贯穿人的一生。特别是在金融行业,由于其变幻莫测的特性,在职继续攻读硕士学位的人越来越多。他们希望通过进一步的学习和研究,提升自己的专业素养…

宏电股份5G RedCap终端产品助力深圳极速先锋城市建设

12月26日,“全城全网,先锋物联”深圳移动5G-A RedCap助力深圳极速先锋城市创新发布会举行,宏电股份携一系列5G RedCap终端产品应邀参与创新发布会,来自全国5G生态圈的各界嘉宾、专家学者济济一堂,共探信息化数字化创新…

鸿鹄工程项目管理系统源码:Spring Boot带来的快速开发与部署体验

随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…

组播(多播)原理及代码

单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口。 单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种折中方 案。多播数据报只应该由对它感兴…

c++ / day04

1. 整理思维导图 2. 全局变量,int monster 10000;定义英雄类hero,受保护的属性string name,int hp,int attck;公有的无参构造,有参构造,虚成员函数 void Atk(){blood-0;},法师类继承自英雄类&a…

MATLAB基本绘图操作(二维和三维绘图)

MATLAB基本绘图操作 文章目录 MATLAB基本绘图操作1、二维平面绘图2、三维立体绘图 1、二维平面绘图 x0:0.01:2*pi; %从09开始,每次递增0.01,一直到2*pi结束 y sin(x) ; figure %建立一个幕布 plot(x, y) %绘制二维的平面图 title(y sin(x)) %标题…

BIND-DNS配置介绍

一、主要配置文件 /etc/named.conf options { //Option 段全部配置 listen-on port 53 { 127.0.0.1; };//表示BIND将在53端口监听,若需要对所有IP进行监听,则修改为// listen-on port 53 { any; }; directory "/var/named"…

前端开发个人简历范本(2024最新版-附模板)

前端开发工程师个人简历范本> 年龄 25岁 性别 男 毕业院校 XX大学 张三 学历 邮箱 leeywai-tools.cn 本科 专业 计算机科学与技术 个人梗概 拥有扎实的前端开发技能和丰富的实践经验 善于与团队合作,适应能力强,能够快速融入团队并贡献自…

从0开始python学习-38.pytest的parametrize结合yaml实现数据驱动

目录 1. 数据驱动 2. 定制化allure报告 1. 数据驱动 yaml文件中写入 -data: 1ces: 2- test:data: 3 数据驱动:pytest.mark.parametrize("参数名","参数值(可以是list或tuple)") 注意:这里参数值只能是列…

2英文中的所有时态格式及相同一句话示例

https://blog.csdn.net/chenhao0568/article/details/135296013?spm1001.2014.3001.5502 英文中的所有时态格式及相同一句话示例 英语中的时态主要分为三大类:过去时、现在时、将来时。每一类时态都有四种基本形式:简单式(一般式&#xff0…