0

0

MySQL 以及 Python 实现排名窗口函数_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:14:17

|

1203人浏览过

|

来源于php中文网

原创

python

超能文献
超能文献

超能文献是一款革命性的AI驱动医学文献搜索引擎。

下载
大部分数据库都提供了窗口函数,比如RANK,ROW_NUMBER等等。 MySQL 这方面没有直接提供,但是可以变相的实现,我以前写了row_number 的实现,今天有时间把 rank 的实现贴出来。
这里,我用MySQL 以及Python 分别实现了rank 窗口函数。
原始表信息:
t_girl=# /d group_concat; Table "ytt.group_concat"Column| Type| Modifiers ----------+-----------------------+----------- rank | integer |username | character varying(20) |
表数据
t_girl=# select * from group_concat; rank | username ------+----------100 | Lucy127 | Lucy146 | Lucy137 | Lucy104 | Lucy121 | Lucy136 | Lily100 | Lily100 | Lily105 | Lily136 | Lily149 | ytt116 | ytt116 | ytt149 | ytt106 | ytt117 | ytt(17 rows)Time: 0.638 ms
PostgreSQL 的rank 窗口函数示例:
t_girl=# select username,rank,rank() over(partition by username order by rank desc) as rank_cnt from group_concat; username | rank | rank_cnt ----------+------+---------- Lily |136 |1 Lily |136 |1 Lily |105 |3 Lily |100 |4 Lily |100 |4 Lucy |146 |1 Lucy |137 |2 Lucy |127 |3 Lucy |121 |4 Lucy |104 |5 Lucy |100 |6 ytt|149 |1 ytt|149 |1 ytt|117 |3 ytt|116 |4 ytt|116 |4 ytt|106 |6(17 rows)Time: 131.150 ms
MySQL 提供了group_concat 聚合函数可以变相的实现:
mysql> select a.username, a.rank, find_in_set(a.rank,b.rank_gp) as rank_cnt from group_concat as a ,(select username,group_concat(rank order by rank desc separator ',')as rank_gp from group_concat group by username ) b where a.username = b.username order by a.username asc,a.rank desc;+----------+------+----------+| username | rank | rank_cnt |+----------+------+----------+| Lily |136 |1 || Lily |136 |1 || Lily |105 |3 || Lily |100 |4 || Lily |100 |4 || Lucy |146 |1 || Lucy |137 |2 || Lucy |127 |3 || Lucy |121 |4 || Lucy |104 |5 || Lucy |100 |6 || ytt|149 |1 || ytt|149 |1 || ytt|117 |3 || ytt|116 |4 || ytt|116 |4 || ytt|106 |6 |+----------+------+----------+17 rows in set (0.02 sec)
当然了,如果MySQL SQL不太熟悉,可以用程序来处理,比如我下面用python 实现了rank 函数,执行结果如下:(脚本源代码最后)
>>> ================================ RESTART ================================>>>username | rank | rank_cnt --------------------------------ytt |149 |1 ytt |149 |1 ytt |117 |3 ytt |116 |4 ytt |116 |4 ytt |106 |6 Lucy|146 |1 Lucy|137 |2 Lucy|127 |3 Lucy|121 |4 Lucy|104 |5 Lucy|100 |6 Lily|136 |1 Lily|136 |2 Lily|105 |3 Lily|100 |4 Lily|100 |4 (17 Rows.)Time: 0.162 Seconds.
附上脚本代码:
from __future__ import print_functionfrom datetime import date, datetime, timedeltaimport mysql.connectorimport time# Created by ytt 2014/5/14.# Rank function implement.def db_connect(is_true):	cnx = mysql.connector.connect(host='192.168.1.131',port='3306',user='python_user', password='python_user',database='t_girl',autocommit=is_true)	return cnxdef db_rs_rank(c1 ='username desc' ,c2 = ' rank desc'):	# c1: partition column.	# c2: sort column.	time_start = time.time()	cnx = db_connect(True)	rs = cnx.cursor()	query0 = "select username,rank from group_concat order by " + c1 + ", " + c2	rs.execute(query0,multi=False)	if rs.with_rows:		rows = rs.fetchall()	else:		return "No rows affected."	i = 0	j = 0	k = 1	result = []	field1_compare = rows[0][0]	field2_compare = rows[0][1]	while i < len(rows):		if field1_compare == rows[i][0]:			j += 1			if field2_compare != rows[i][1]:				field2_compare =rows[i][1]				k = j			result.append((rows[i][0],rows[i][1],k))		else:			j = 1			k = 1			field1_compare = rows[i][0]			result.append((rows[i][0],rows[i][1],k))		i += 1	i = 0	rows_header = list(rs.column_names)	rows_header.append('rank_cnt')	print (rows_header[0].center(10,' ') + '|' + rows_header[1].center(10,' ') + '|' + rows_header[2].center(10,' '))	print ('-'.center(32,'-'))	while i < len(result):		print (result[i][0].ljust(10,' ') + '|' + str(result[i][1]).ljust(10,' ') + '|' + str(result[i][2]).ljust(10,' '))		i += 1	rs.close()	cnx.close()	time_end = time.time()	print ('(' + str(len(rows))+ ' Rows.)')	print ("Time:" + str(round((time_end-time_start),3)).rjust(10,' ') + ' Seconds.')	if __name__=='__main__':	db_rs_rank()

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java 抽象方法
java 抽象方法

本专题整合了java抽象方法定义、作用教程等内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.05

Eclipse创建jsp文件教程合集
Eclipse创建jsp文件教程合集

本专题整合了Eclipse创建jsp文件、创建jsp项目等等内容,阅读专题下面的文章了解更多详细教程。

0

2026.02.05

java 字符串转数字
java 字符串转数字

本专题整合了java如何字符串转数字相关内容,阅读专题下面的文章了解更多详细教程。

2

2026.02.05

java中jlabel的作用
java中jlabel的作用

本专题整合了java中label相关内容,阅读专题下面的文章了解更多详细教程。

0

2026.02.05

java return合集
java return合集

本专题整合看java中return关键词的用途,语句的使用等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.05

AO3官网入口与镜像站汇总 Archive of Our Own访问路径及最新入口
AO3官网入口与镜像站汇总 Archive of Our Own访问路径及最新入口

本专题专注于提供Archive of Our Own (AO3) 的最新官网入口与镜像站地址,详细整理了可用的访问路径,包括中文镜像站入口和网页版直达链接,帮助用户轻松找到最稳定的访问方式,确保顺畅浏览AO3内容。

8

2026.02.05

192.168.1.1路由器后台管理入口与设置登录指南
192.168.1.1路由器后台管理入口与设置登录指南

本专题汇总了192.168.1.1路由器的后台管理入口、登录网址以及无线网络设置的方法,帮助用户快速进入路由器管理页面,进行网络配置、密码修改等常见操作,提升家庭网络的管理与优化效率。

1

2026.02.05

Python 数据库优化与性能调优
Python 数据库优化与性能调优

本专题专注讲解 Python 在数据库性能优化中的应用,包括数据库连接池管理、SQL 查询优化、索引设计与使用、数据库事务管理、分布式数据库与缓存系统的结合。通过分析常见性能瓶颈,帮助开发者掌握 如何优化数据库操作,提升 Python 项目在数据库层的响应速度与处理能力。

2

2026.02.05

Java 微服务与 Spring Cloud 实战
Java 微服务与 Spring Cloud 实战

本专题讲解 Java 微服务架构的开发与实践,重点使用 Spring Cloud 实现服务注册与发现、负载均衡、熔断与限流、分布式配置管理、API Gateway 和消息队列。通过实际项目案例,帮助开发者理解 如何将传统单体应用拆分为高可用、可扩展的微服务架构,并有效管理和调度分布式系统中的各个组件。

0

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.4万人学习

Django 教程
Django 教程

共28课时 | 3.9万人学习

Excel 教程
Excel 教程

共162课时 | 15.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号