[每日一练]关于不同表格之间的对比

# 该题目来源于力扣:

2072. 赢得比赛的大学 - 力扣(LeetCode)

一:题目要求:

表: NewYork

+-------------+------+
| Column Name | Type |
+-------------+------+
| student_id  | int  |
| score       | int  |
+-------------+------+
在 SQL 中,student_id 是这个表的主键。
每一行包含纽约大学 (New York University) 中一名学生一次考试的成绩。
 

表: California

+-------------+------+
| Column Name | Type |
+-------------+------+
| student_id  | int  |
| score       | int  |
+-------------+------+
在 SQL 中,student_id 是这个表的主键。
每一行包含加州大学 (California University) 中一名学生一次考试的成绩。
 

纽约大学和加州大学之间举行了一场比赛。这场比赛由两所大学中相同数量的学生参加。拥有更多优秀学生的大学赢得这场比赛。如果两所大学的优秀学生数量相同,则这场比赛平局。

优秀学生是指在考试中获得 90% 或更高成绩的学生。

返回:

"New York University" 若纽约大学赢得这场比赛。
"California University" 若加州大学赢得这场比赛。
"No Winner" 若这场比赛平局。
返回结果格式如下示例所示:

 

示例 1:

输入: 
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1          | 90    |
| 2          | 87    |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2          | 89    |
| 3          | 88    |
+------------+-------+
输出: 
+---------------------+
| winner              |
+---------------------+
| New York University |
+---------------------+
解释:
纽约大学有 1 名优秀学生,加州大学有 0 名优秀学生。
示例 2:

输入: 
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1          | 89    |
| 2          | 88    |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2          | 90    |
| 3          | 87    |
+------------+-------+
输出: 
+-----------------------+
| winner                |
+-----------------------+
| California University |
+-----------------------+
解释:
纽约大学有 0 名优秀学生,加州大学有 1 名优秀学生。
示例 3:

输入: 
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1          | 89    |
| 2          | 90    |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2          | 87    |
| 3          | 99    |
+------------+-------+
输出: 
+-----------+
| winner    |
+-----------+
| No Winner |
+-----------+
解释:
纽约大学和加州大学均有 1 名优秀学生。

二:思路流程

该题目的业务要求就是将两张表进行统计聚合后,对聚合的数据进行对比。但是两张表没有相同的键值,数据完全不一样。

思路一:使用with函数进行临时数据表的存储,然后用case when代码进行流程判断:

with t1 as (
    select count(student_id) as num_a from NewYork where score >= 90
),
t2 as (
    select count(student_id) as num_b from California where score >= 90
)

select
case
    when num_a > num_b then 'New York University'
    when num_a < num_b then 'California University'
    else 'No Winner'
end as winner
from t1,t2

注意这里需要将储存函数中的聚合函数进行命名,以便在后续调用两个临时表格的时候直接进行调用。

如果不嫌麻烦的话,可以直接对比select语句,代码看起来更臃肿,不过节省内存,适合短期使用。实现原理如下:

select 
case
    when (select count(student_id) from NewYork where score >= 90) > (select count(student_id) from California where score >= 90) then "New York University"
    when (select count(student_id) from NewYork where score >= 90) < (select count(student_id) from California where score >= 90) then 'California University'
    else 'No Winner'
    end as winner

三:pandas实现

import pandas as pd

def find_winner(new_york: pd.DataFrame, california: pd.DataFrame) -> pd.DataFrame:
    #新建输出数据框,初始值为NAN
    data = pd.DataFrame({'winner': [None]})
    new_york=new_york.query('score >=90')
    california=california.query('score >=90')
    new_york_count=new_york['student_id'].count()
    california_count=california['student_id'].count()
    #建立自定义函数对两个聚合变量进行判断
    def f1(new_york_count,california_count):
        if new_york_count > california_count:
            return "New York University"
        if new_york_count < california_count:
            return "California University"
        else :
            return 'No Winner'
    #将全局变量new_york_count和california_count作为参数传入f1,并且保存到为空值的data的winner列中
    data['winner']=f1(new_york_count,california_count)
    return data[['winner']]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值