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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年03月05日 19时20分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php数据库结构对比 微擎,禾匠数据库对比–微擎通用各类数据库结构对比教程...
2019-04-21
mitproxy php,orion-c
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
点击定位到指定位置_使用Word书签功能轻松定位到指定位置或某个特定内容
2019-04-21
图像控制点 形变_几何校正中控制点的选取.doc
2019-04-21
cpu超线程优缺点_今天看了下百度百科!看到了超线程的优缺点啊!转!
2019-04-21
java servlet 返回 web_javaWEB之Servlet
2019-04-21
java poi_Java POI(第一讲):POI简介
2019-04-21