sql实现row_number()方法以及使用pandas升级
发布日期:2022-02-12 16:07:05 浏览次数:1 分类:技术文章

本文共 2370 字,大约阅读时间需要 7 分钟。

一、背景

鉴于sqlserver的row_number函数的便捷性,寻思sql如何实现,遍向大佬学习了一番,自我感觉还不错,于是来加强巩固一下。

 

二、步骤

1. 原始数据表

select		st.Sname Sname		,st.Ssex Ssex		,sc.Degree Degree		,te.Tname Tname		,te.Prof Prof		,te.Depart Depart		,cs.Cname Cname		from Student as st		-- 关联成绩表		LEFT JOIN Score as sc		on st.Sno = sc.Sno		-- 关联科目		left join Course as cs 		on cs.Cno = sc.Cno		-- 关联教师表		left join Teacher as te 		on te.Tno = cs.Tno		order by st.Sname, sc.Degree desc

查询结果如下:

在这里插入图片描述

2. 需求:想实现获取每个学生成绩最好的科目信息

3. 思路:

增加临时变量去记录需要分组的值,同时增加一个等级变量,去记录分组排名的结果,后面可以根据结果去查询响应等级的值。 @group_clum : 此处用这个变量记录分组的值 @rank: 此处用这个变量记录分组后的等级

三、经典SQL实现:

- 查询所有学生的成绩 按照 学生姓名 性别 课程名称 成绩 展示该学生成绩最高的科目信息select * from 	(select 	*	,@rank := case when @group_clum != T1.Sname then 1 else @rank +1 end as rank	,@group_clum:=T1.Sname as group_clum_tmp	from (		select		st.Sname Sname		,st.Ssex Ssex		,sc.Degree Degree		,te.Tname Tname		,te.Prof Prof		,te.Depart Depart		,cs.Cname Cname		from Student as st		LEFT JOIN Score as sc		on st.Sno = sc.Sno		left join Course as cs 		on cs.Cno = sc.Cno		left join Teacher as te 		on te.Tno = cs.Tno		order by st.Sname, sc.Degree desc	) as T1) as T2where T2.rank =1 order by T2.Degree desc

查询结果如下,大功告成!

四、优化思考

使用pandas直接读取数据库,使用dataframe的merge查询获取数据信息。

import pandas as pdfrom pymysql import ConnectMYSQL_DB = {    "host": "192.168.xx.xx",    "user": "xxx",    "password": "xxx",    "database": "ZuoYe",    "charset": "utf-8"}conn = Connect(host=MYSQL_DB["host"], port=3306, user=MYSQL_DB["user"], password=MYSQL_DB["password"], database=MYSQL_DB["database"])sql_student = "select * from Student;"sql_score = "select * from Score;"sql_teacher = "select * from Teacher;"sql_course = "select * from Course;"df_student = pd.read_sql_query(sql_student, conn)df_score = pd.read_sql_query(sql_score, conn)df_teacher = pd.read_sql_query(sql_teacher, conn)df_course = pd.read_sql_query(sql_course, conn)df1 = pd.merge(df_student, df_score, left_on=["Sno"], right_on=["Sno"], how="left")df2 = pd.merge(df1, df_course, left_on=["Cno"], right_on=["Cno"], how="left")df3 = pd.merge(df2, df_teacher, left_on=["Tno"], right_on=["Tno"], how="left")df4 = df3[["Sname", "Ssex", "Degree", "Tname", "Prof", "Depart", "Cname"]]df5 = df4.copy()df5.sort_values(axis=0, by=["Sname", "Degree"], ascending=[True, False], inplace=True)df6 = df5.drop_duplicates(["Sname"])print(df6.sort_values(["Degree"], ascending=False))

同样输出了结果:

转载地址:https://blog.csdn.net/wenq_yang/article/details/109334984 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:经典排序之插入排序(希尔排序)
下一篇:dataframe 修改指定位置的值 提示 SettingWithCopyWarning的解决办法

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月05日 19时20分58秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php数据库结构对比 微擎,禾匠数据库对比–微擎通用各类数据库结构对比教程... 2019-04-21
mitproxy php,orion-c 2019-04-21
oracle外部表ora29913,从外部表中选择sqlplus错误:ORA-29913:执行ODCIEXTTABLEOPEN标注时出错... 2019-04-21
oracle负载均衡方案,Oracle负载均衡配置代码 2019-04-21
html语言放到数据库中,怎样把输入的文本转换成html代码存入数据库啊 2019-04-21
html描述列表在线实例,HTML的列表标签 2019-04-21
mysql 允许网络连接_MySQL 权限问题 允许所有网络的连接 2019-04-21
mysql查询服务器_MySQL查询执行 2019-04-21
oracle和mysql空字符串_Oracle中Null与空字符串' '的区别 2019-04-21
android webview静态方法,在android webview中加载静态页面 2019-04-21
Android网络期末考,Android 面试之「网络基础篇」 2019-04-21
html如何修改按钮样式,css怎么设置按钮样式? 2019-04-21
nextcloud如何填写数据库_OMV利用Docker配置nextcloud,实现个人网盘的搭建! 2019-04-21
点击定位到指定位置_使用Word书签功能轻松定位到指定位置或某个特定内容 2019-04-21
图像控制点 形变_几何校正中控制点的选取.doc 2019-04-21
cpu超线程优缺点_今天看了下百度百科!看到了超线程的优缺点啊!转! 2019-04-21
python2和3安装后怎样切换 mac_Mac下安装配置Python2和Python3并相互切换使用 2019-04-21
python错误代码40035_python-(matplotlib.pyplot)散点图轴的顺序错误 2019-04-21
java servlet 返回 web_javaWEB之Servlet 2019-04-21
java poi_Java POI(第一讲):POI简介 2019-04-21