• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MySQL 以及 Python 实现排行窗口函数

mysql 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

MySQL 以及 Python 实现排名窗口函数 大部分数据库都提供了窗口函数,比如RANK,ROW_NUMBER等等。 MySQL 这方面没有直接提供,但是可以变相的实现,我以前写了row_number 的实现,今天有时间把 rank 的实现贴出来。 这里,我用MySQL 以及Python 分别实现了rank

MySQL 以及 Python 实现排名窗口函数
大部分数据库都提供了窗口函数,比如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 ------+----------  10
本文来源gaodai.ma#com搞##代!^码@网*
0 | Lucy 127 | Lucy 146 | Lucy 137 | Lucy 104 | Lucy 121 | Lucy 136 | Lily 100 | Lily 100 | Lily 105 | Lily 136 | Lily 149 | ytt 116 | ytt 116 | ytt 149 | ytt 106 | ytt 117 | 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.

附上脚本代码:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MySQL 以及 Python 实现排行窗口函数

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址