mysql 让一个字段先正数升序,再负数降序,动态给排序号

# mysql如何实现,让一个字段先正数升序,再负数降序。

目前已经实现了Oracle下的SQL语句,但是mysql不支持rank()函数,请教mysql下如何处理:

orcale实现的sql如下,如何改成mysql的

     select RANK() OVER(PARTITION BY period_value ORDER BY sign(target_bnlj_val) desc, abs(target_bnlj_val)) 序号,
       z.period_value 期间,
       o.org_sort 单位编号,
       ta.seq 类型编号,
       b.target_bnlj_val 数值
          from T_ZB_VAL b
          left join t_zb_period z
            on z.id = b.period_id
          left join T_ZB_org o
            on o.id = b.org_id
          left join t_zb_target ta
            on ta.id = b.target_id
         where target_id = '1fb6b27f5c4f4463aa6abafa5f6eff69'
           and o.org_type = '11'o.org_type = '11'

下图为执行后的数据:

图片说明

由于没有C币了,大神解决了,加微信红包感谢。

实现一样的,mysql也有这两个函数
第一个函数是判断数字的正负号,正数为1负数为-1 desc 逆序
第二个函数是取绝对值 没指定排序方式默认从小到大

order by sign(target_bnlj_val) desc, abs(target_bnlj_val)

只不过sql的order by是写在后面的

select * from table where a=b order by a 

新版本的 MySQL 中已经支持开窗了。如果现版本不行,可以用连接子查询实现开窗(后面的连接就不写了):
select target_bnlj_val, (select count(*) from tbl t2
where case when t2.target_bnlj_val >= 0
then t2.target_bnlj_val
else abs(t2.target_bnlj_val) + (select max(target_bnlj_val) from tbl) end
<
case when t1.target_bnlj_val >= 0
then t1.target_bnlj_val
else abs(t1.target_bnlj_val) + (select max(target_bnlj_val) from tbl) end) + 1 rnk
from tbl t1