# 该题目来源于力扣:
一:题目要求:
表: 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']]