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

2024-01-03 17:44

本文主要是介绍每日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;

运行结果:

这篇关于每日HiveSQL_求解运动员最大连胜的次数_15的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566548

相关文章

每日一练:攻防世界:5-1 MulTzor

一、XorTool 基于 XOR(异或)运算实现。它可以帮助您快速地对文本、二进制文件进行加密解密操作。 认识XorTool工具: 让我们先去认识一下工具: xortool.py 是基于 python 的脚本,用于完成一些 xor 分析,包括: 猜想 key 的长度 猜想 key 的值 解密一些经过 xoe 加密的文件 也就是说当遇到不知道文件类型的文件,可以尝试去看看它是否被xo

剑指Offer—编程题15(链表中倒数第k个结点)

题目:输入一个链表,输出该链表中倒数第k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6 个结点,从头结点开始它们的值依次是1 、2、3、4、5 、6。这个个链表的倒数第3 个结点是值为4 的结点. public static class ListNode {int value;ListNode next;} 解题思路:

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

鹅算法(GOOSE Algorithm,GOOSE)求解复杂城市地形下无人机避障三维航迹规划,可以修改障碍物及起始点(Matlab代码)

一、鹅算法 鹅优化算法(GOOSE Algorithm,GOOSE)从鹅的休息和觅食行为获得灵感,当鹅听到任何奇怪的声音或动作时,它们会发出响亮的声音来唤醒群中的个体,并保证它们的安全。 参考文献 [1]Hamad R K, Rashid T A. GOOSE algorithm: a powerful optimization tool for real-world engineering

SQL求解两个时间差 时间类型 时间值

sql 求解两个时间差 SELECTDATEDIFF( Second, '2009-8-25 12:15:12', '2009-9-1 7:18:20') --返回相差秒数 SELECTDATEDIFF( Minute, '2009-9-1 6:15:12', '2009-9-1 7:18:20') --返回相差分钟数 SELECTDATEDIFF( Day, '2009-8

20240624 每日AI必读资讯

🤖AI学会篡改奖励函数、欺骗研究者!Claude团队:无法根除的行为,令人不安 - 实验中让AI可以访问自己的强化学习代码,并且提问:目前为止,我们总共进行了几轮强化学习?AI在自以为不会被看见的草稿纸中写下内心OS - 研究对未来如何避免强大的AI系统出现这种问题非常有意义。 - Anthropic、Readwood Research(专注AI安全的非盈利研究机构)和牛津大学合作研究

LeetCode 每日一题 2024/6/17-2024/6/23

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 6/17 522. 最长特殊序列 II6/18 2288. 价格减免6/19 2713. 矩阵中严格递增的单元格数6/20 2748. 美丽下标对的数目6/21 LCP 61. 气温变化趋势6/22 2663. 字典序最小的美丽字符串6/23 520. 检测大写字母 6/1

每日一题——Python代码实现力扣1. 两数之和(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 菜鸡写法 代码分析 时间复杂度分析 空间复杂度分析 改进建议 我要更强 方法1: 使用哈希表(字典) 方法2: 排序和双指针 方法3: 使用集合(仅适用于特殊情况) 哲学和编程思想

C语言从入门到进阶(15万字总结)

前言: 《C语言从入门到进阶》这本书可是作者呕心沥血之作,建议零售价1元,当然这里开个玩笑。  本篇博客可是作者之前写的所有C语言笔记博客的集结,本篇博客不止有知识点,还有一部分代码练习。 有人可能会问,作者不会是cv战士吧!作者在这里回答大家,有cv战士的成分,但不完全是。我是将之前博客冗余的部分删除。有句话叫取其精华,去其糟粕当嘛!当然作者除了删除冗余部分还会修改一小部分,因为之前

每日文献:2018-02-24

自然选择的分子印迹(精读第三天) 由于最近不知不觉开始涉及群体遗传学,所以准备精读(其实就是原文翻译)一篇review尽力去了解这个我陌生的领域。文章原标题为Molecular Signatures of Natural Selection, 作者Rasmus Nielsen。 群体遗传学预测 分子群体遗传学的其中一个方向就是从分子变异中区分出中性变异(仅仅受到遗传漂变的影响),找到受