LeetCode_sql_day24(1212.查询球队积分)

news2025/1/9 17:14:04

描述

表: Teams

+---------------+----------+
| Column Name   | Type     |
+---------------+----------+
| team_id       | int      |
| team_name     | varchar  |
+---------------+----------+
team_id 是该表具有唯一值的列。
表中的每一行都代表一支独立足球队。

表: Matches

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| match_id      | int     |
| host_team     | int     |
| guest_team    | int     | 
| host_goals    | int     |
| guest_goals   | int     |
+---------------+---------+
match_id 是该表具有唯一值的列。
表中的每一行都代表一场已结束的比赛。
比赛的主客队分别由它们自己的 id 表示,他们的进球由 host_goals 和 guest_goals 分别表示。

你希望在所有比赛之后计算所有球队的比分。积分奖励方式如下:

  • 如果球队赢了比赛(即比对手进更多的球),就得 3 分。
  • 如果双方打成平手(即,与对方得分相同),则得 1 分。
  • 如果球队输掉了比赛(例如,比对手少进球),就 不得分 。

编写解决方案,以找出每个队的 team_idteam_name 和 num_points

返回的结果根据 num_points 降序排序,如果有两队积分相同,那么这两队按 team_id  升序排序

返回结果格式如下。

示例 1:

输入: Teams

table:
+-----------+--------------+
| team_id   | team_name    |
+-----------+--------------+
| 10        | Leetcode FC  |
| 20        | NewYork FC   |
| 30        | Atlanta FC   |
| 40        | Chicago FC   |
| 50        | Toronto FC   |
+-----------+--------------+
Matches
table:
+------------+--------------+---------------+-------------+--------------+
| match_id   | host_team    | guest_team    | host_goals  | guest_goals  |
+------------+--------------+---------------+-------------+--------------+
| 1          | 10           | 20            | 3           | 0            |
| 2          | 30           | 10            | 2           | 2            |
| 3          | 10           | 50            | 5           | 1            |
| 4          | 20           | 30            | 1           | 0            |
| 5          | 50           | 30            | 1           | 0            |
+------------+--------------+---------------+-------------+--------------+
输出:
+------------+--------------+---------------+
| team_id    | team_name    | num_points    |
+------------+--------------+---------------+
| 10         | Leetcode FC  | 7             |
| 20         | NewYork FC   | 3             |
| 50         | Toronto FC   | 3             |
| 30         | Atlanta FC   | 1             |
| 40         | Chicago FC   | 0             |
+------------+--------------+---------------+

数据准备

Create table If Not Exists Teams (team_id int, team_name varchar(30))
Create table If Not Exists Matches (match_id int, host_team int, guest_team int, host_goals int, guest_goals int)
Truncate table Teams
insert into Teams (team_id, team_name) values ('10', 'Leetcode FC')
insert into Teams (team_id, team_name) values ('20', 'NewYork FC')
insert into Teams (team_id, team_name) values ('30', 'Atlanta FC')
insert into Teams (team_id, team_name) values ('40', 'Chicago FC')
insert into Teams (team_id, team_name) values ('50', 'Toronto FC')
Truncate table Matches
insert into Matches (match_id, host_team, guest_team, host_goals, guest_goals) values ('1', '10', '20', '3', '0')
insert into Matches (match_id, host_team, guest_team, host_goals, guest_goals) values ('2', '30', '10', '2', '2')
insert into Matches (match_id, host_team, guest_team, host_goals, guest_goals) values ('3', '10', '50', '5', '1')
insert into Matches (match_id, host_team, guest_team, host_goals, guest_goals) values ('4', '20', '30', '1', '0')
insert into Matches (match_id, host_team, guest_team, host_goals, guest_goals) values ('5', '50', '30', '1', '0')

分析

法一:
①先计算出主队得分和客队得分情况

select host_team,
                   guest_team,
                   host_goals,
                   guest_goals,
                   case
                       when host_goals > guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end host_points,
                   case
                       when host_goals < guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end guest_points
            from matches

②然后根据主队、客队得分情况求和

with t1 as (select host_team,
                   guest_team,
                   host_goals,
                   guest_goals,
                   case
                       when host_goals > guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end host_points,
                   case
                       when host_goals < guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end guest_points
            from matches)
   select host_team, sum(host_points) points1
            from t1
            group by host_team
            union all
            select guest_team, sum(guest_points) points1
            from t1
            group by guest_team

③连接两张表 根据球队分组 求总共的分数  此处是用teams左连接 获取到所有球队信息 

用ifnull函数 先对分数判空 如果为空则赋0

select team_id, team_name, sum(ifnull(points1, 0)) num_points
from teams
         left join t2
                   on teams.team_id = t2.host_team
group by team_id, team_name
order by num_points desc, team_id

法二:

①先连接两张表  条件是 team_id = host_team or team_id = guest_team  并且为左连接

select team_id,team_name from Teams left join matches on team_id = host_team  or team_id = guest_team

②对各个球队得分进行定义

如果是根据主队id关联 那么主队赢了积三分

如果是根据客队id关联 那么客队赢了积三分

如果 主队得分=客队 那么不论根据什么关联 都积一分

否则就是零分

select team_id,team_name ,
       case
           when team_id = host_team and host_goals > guest_goals then 3
           when host_goals = guest_goals then 1
           when team_id = guest_team and host_goals < guest_goals then 3
           else 0 end num_points
from Teams left join matches on team_id = host_team  or team_id = guest_team

③然后根据上一步结果 进行分组排序 

select team_id,team_name ,
       sum(case
           when team_id = host_team and host_goals > guest_goals then 3
           when host_goals = guest_goals then 1
           when team_id = guest_team and host_goals < guest_goals then 3
           else 0 end )num_points
from Teams left join matches on team_id = host_team  or team_id = guest_team
group by team_id, team_name
order by num_points desc,team_id

代码

# 法一
with t1 as (select host_team,
                   guest_team,
                   host_goals,
                   guest_goals,
                   case
                       when host_goals > guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end host_points,
                   case
                       when host_goals < guest_goals then 3
                       when host_goals = guest_goals then 1
                       else 0 end guest_points
            from matches)
   , t2 as (select host_team, sum(host_points) points1
            from t1
            group by host_team
            union all
            select guest_team, sum(guest_points) points1
            from t1
            group by guest_team)
select team_id, team_name, sum(ifnull(points1, 0)) num_points
from teams
         left join t2
                   on teams.team_id = t2.host_team
group by team_id, team_name
order by num_points desc, team_id;
# 法二
select team_id,team_name ,
       sum(case
           when team_id = host_team and host_goals > guest_goals then 3
           when host_goals = guest_goals then 1
           when team_id = guest_team and host_goals < guest_goals then 3
           else 0 end )num_points
from Teams left join matches on team_id = host_team  or team_id = guest_team
group by team_id, team_name
order by num_points desc,team_id

总结

法一是先判断后连接

法二是先连接后判断

关键点是 两张表关联条件  和 赋分情况的考虑

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

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

相关文章

[机器学习]逻辑回归

1 前置知识 逻辑回归解决二分类问题。sigmoid函数&#xff1a;非线性&#xff0c;值域(0,1)概率值 2 逻辑回归原理 3 癌症分类案例 import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import Standa…

Python爬虫案例七:抓取南京公交信息数据并将其保存成excel多表形式

测试链接: https://nanjing.8684.cn/line4 思路&#xff1a;先抓取某个类型下的某一条线路所有数据&#xff0c;然后实现批量,&#xff0c;列举出三个类型代表既可 源码&#xff1a; from lxml import etree from xlutils.copy import copy import requests, os, xlrd, xlwtd…

【计算机网络】电路交换、电报交换、分组交换

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 1. 电路交换 电路交换&#xff08;Circuit Switching&#xff09;:通过物理线路的连接&#xff0c;动态地…

为什么总是分心?(影响专注力的5因素)

【Ali Abdaal】Why You’re Always Distracted - 5 Mistakes Ruining Your Focus 介绍 在这个视频中&#xff0c;将讨论影响你注意力的五个主要因素。 内容将深入研究如何提高专注力、避免分心&#xff0c;从而更有效地投入到你的工作和学习中。 视频提供了一些实用的技巧和…

redis群集的三种模式

目录 一、redis群集有三种模式 二、redis主从复制 2.1 概念 2.2 主从复制的作用 2.3 主从复制流程 三、搭建redis主从复制 四、redis哨兵模式 4.1 概念 4.2 哨兵模式原理: 4.3 哨兵模式的作用&#xff1a; 4.4 故障转移机制&#xff1a; 4.5 主节点的选举&#xff…

Python编码系列—Python工厂方法模式:构建灵活对象的秘诀

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Vue组件:模板引用ref属性的使用

Vue 组件系列文章&#xff1a; 《Vue组件&#xff1a;创建组件、注册组件、使用组件》 《Vue组件&#xff1a;使用Prop实现父组件向子组件传递数据》 《Vue组件&#xff1a;使用$emit()方法监听子组件事件》 《Vue组件&#xff1a;插槽》 《Vue组件&#xff1a;混入》 《Vue组件…

解读工控, PLC+组态能替代DCS吗?

在工业自动化的浪潮中&#xff0c;技术的不断进步正在重塑我们对于控制系统的传统认知。前几天听到一个颇为有趣的观点——现代的DCS可以被看作是PLC加上组态的结合体。这个观点引发了我的深思&#xff0c;因为它不仅触及了工业自动化领域的技术变革&#xff0c;也反映了在数字…

基于Python的电影票房数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的电…

等保测评中的合规性自查:企业指南

在信息安全等级保护&#xff08;等保&#xff09;体系下&#xff0c;合规性自查是企业确保自身信息安全管理水平符合国家法律法规和标准要求的关键步骤。本文旨在为即将进行等保测评的企业提供一份详细的合规性自查指南&#xff0c;帮助企业顺利通过测评。 一、合规性自查的重…

Games101学习 - 光栅化

Games101中讲解的光栅化的基础知识&#xff0c;本文就来梳理一下。 在UE中使用UTexture2D可以逐像素绘制纹理&#xff1a; https://blog.csdn.net/grayrail/article/details/142165442 1.绘制三角形 这里可以通过101中讲解的叉积法逐像素绘制三角形&#xff1a; 绘制效果&a…

4G物联网智能电表是什么?什么叫4G物联网智能电表?

4G物联网智能电表是一种结合了4G无线通信技术的新型电能计量设备&#xff0c;用于实时采集和传输用户的用电数据。它通过集成现代信息技术和电力电子技术&#xff0c;不仅能够精确测量电力消耗&#xff0c;还能实现远程数据传输、数据分析、远程控制等多种功能。本文将详细介绍…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

宝马销量崩了,自己作死拦都拦不住

文 | AUTO芯球 作者 | 雷慢 什么叫有人欢喜有人忧&#xff1f;这就是啦&#xff1a; 问界M9五座版上市当天&#xff0c;宣布M9大定破了13万台&#xff0c; 另一边呢&#xff0c;宝马股票当天暴跌近10%&#xff0c; 原因是什么呢&#xff0c;是宝马的业绩预期降了&#xff0…

把公文写得好准快,原来他们悄悄使用了这款工具……

在公文写作时&#xff0c;您可能面临着以下挑战&#xff1a; 1、材料要求高&#xff0c;需要全面掌握思想站位、时效性、文风表达、内容法定性、行为规范性、表达特定性。 2、要求理论功底强、精通专业知识、遣词造句精准、强抗压以及百科知识储备丰富。 3、老题新作构思难&…

Spire.PDF for .NET【页面设置】演示:为 PDF 添加背景颜色或背景图像

在 PDF 文档中&#xff0c;背景是指页面内容背后的整体视觉外观。背景可以是简单的纯色&#xff0c;也可以是您选择的图像。向 PDF 添加背景可以帮助您增加文档的视觉趣味&#xff0c;并提高可读性。在本文中&#xff0c;您将学习如何使用Spire.PDF for .NET以编程方式设置 PDF…

固态继电器(SSR):分步概述

固态继电器(SSR)已成为现代电气和电子控制系统中的重要组成部分。它们通过提供更快的切换速度、更长的使用寿命和更好的可靠性&#xff0c;为传统机电继电器(EMR)提供了更好的替代方案。本文将逐步探讨SSR的工作原理、主要特性、优势和实际应用。 什么是固态继电器&#xff1f;…

稳石机器人第四季度全员冲刺大会圆满落幕

2024年已在挑战与机遇的交织中悄然流逝了八个月&#xff0c;在正式入秋之际&#xff0c;稳石机器人在深圳总部一楼召开了第四季度全员大会。本次大会以“携手共进&#xff0c;共创未来”为主题&#xff0c;旨在总结过去&#xff0c;规划未来&#xff0c;并激发团队为实现公司目…

旅游网站设计与实现:SpringBoot技术手册

第三章 系统分析 开发一个系统首先要对系统进行分析&#xff0c;是开发者针对系统实际客户对软件应用的一个调查访问和研究&#xff0c;弄清用户对软件需求的具体要求&#xff0c;同时开发者还要对系统开发的经济和可技术上是否可行进行分析&#xff0c;并确定系统开发的成本和…

一文读懂:如何将广告融入大型语言模型(LLM)输出

本文是我翻译过来的&#xff0c;讨论了在线广告行业的现状以及如何将大型语言模型&#xff08;LLM&#xff09;应用于在线广告。 原文请参见”阅读原文“。 在2024年&#xff0c;预计全球媒体广告支出的69%将流向数字广告市场。这个数字预计到2029年将增长到79%。在Meta的2024…