mysql给我的愚人节礼物——分组排序进行排名语句存在的问题

今天我被mysql给愚了,写一个分数排名的业务sql语句,数据库使用的是mysql,数据库版本是8.0.18。在网上找到一个关于排名的语句写的比较复杂,经过调整之后满足了自己的业务需要。在使用过程中出现问题。
使用IF(path=@p1 AND zydh1=@p2,@r:=@r+1,@r:=1)此种方式问题,每次新建连接到数据库时首次查询排序伪劣字段为空,不能进行排名困扰好久。

SELECT A.*,IF(path=@p1 AND zydh1=@p2,@r:=@r+1,@r:=1) AS rownum,@p1:=path,@p2:=zydh1  FROM (
SELECT path,title,tj_zf,zyzytj,zydh1,zydh2,zydh3,zydh4,zydh5,year,lqtype,'0' flag FROM (SELECT * FROM  gk_school_bk_rsinfo WHERE 1=1  AND YEAR=2021 AND PATH IN('3B764') and zydh1 in('20','26','27','29') AND LQTYPE = '普通理科'  AND tj_zf>=450.0 ) A   ) A,(SELECT @p1:=NULL,@p2:=NULL,@rownum:=0) r WHERE 1=1  AND YEAR=2021 AND PATH IN('3B764') and zydh1 in('20','26','27','29') AND LQTYPE = '普通理科'  AND tj_zf>=450.0 order by path,zydh1,tj_zf desc

在这里插入图片描述

因此在查找网上资料时改为使用内置函数排序函数row_number()配合分组函数 partition by 进行排序

SELECT A.*  FROM (
SELECT path,title,tj_zf,zyzytj,zydh1,zydh2,zydh3,zydh4,zydh5,year,lqtype,'0' flag,row_number() OVER (partition by path,zydh1 ORDER BY tj_zf DESC) AS 'rank' FROM (SELECT * FROM  gk_school_bk_rsinfo WHERE 1=1  AND YEAR=2021 AND PATH IN('3B764') and zydh1 in('20','26','27','29') AND LQTYPE = '普通理科'  AND tj_zf>=450.0 ) A    ) A WHERE 1=1  AND YEAR=2021 AND PATH IN('3B764') and zydh1 in('20','26','27','29') AND LQTYPE = '普通理科'  AND tj_zf>=450.0 order by path,zydh1,tj_zf desc

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yxlalm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值