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'
实现一样的,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