吉他里的俊 15:45:35
name score
AA 67
BB 85
CC 98
DD 58
EE 72
FF 83
GG 47如果score > 70 , 排名第一, 其余的按降序排名
结果:name score rank
AA 67 5
BB 85 1
CC 98 1
DD 58 6
EE 72 1
FF 83 1
GG 47 7
解决方案 »
- 这句话什么意思
- Oracle时间相减
- putty远程链接上unix服务器,如何操作安装在上面的PostgreSQL数据库?
- 数据库连接???急急急
- oracle 安装到 net8 configuration assistant 死掉
- pb函数转成oracle函数,需返回一个pb中结构体形式的数据,怎样实现?
- varcher(64)变为varcher(40),的oracle的SQL语句如何写?高手帮忙!
- oracle 端口问题 救命
- 请问,Jdbc连接oracle数据库,我怎么在程序中获取oracle的错误码?
- SQL查询
- 关于oracle内存数据库timesten的求教!!!
- 请教一个多关键字查询问题
网上搜了半天,没有找到可以在rank()方法里写条件的
如果有类似于这种写法,如果score >70 排名第一,其余按降序排序,
希望oracle忙出来这种方法,大家想想有没有实现的方法,如果一条sql能实现更好
大家把自己的想法说出来
create table t1 (name varchar2(10),score number(3));insert into t1 values ('AA',67);
insert into t1 values ('BB',85);
insert into t1 values ('CC',98);
insert into t1 values ('DD',58);
insert into t1 values ('EE',72);
insert into t1 values ('FF',83);
insert into t1 values ('GG',47);
commit;select name,
score,
case when score >= 70 then 1 else rank() over(order by score desc) end rank
from t1
order by name name score rank
--------------------------------
1 AA 67 5
2 BB 85 1
3 CC 98 1
4 DD 58 6
5 EE 72 1
6 FF 83 1
7 GG 47 7
score,
decode(sign(score-70),-1, rank() over(order by score desc),1) c1
from t1
order by name
1.score >=70 and score <=80 排名第一(其余的按升序或者降序)
2.core >=70,其余再按升序排名,
3.core <=70,其余再按降序排名
这几种条件时就不适合了?
select name,
score,
case when score >= 70 then 1 else rank() over(order by score asc) end rank
from t1
order by name
2.
select name,
score,
case when score <= 70 then 1 else rank() over(order by score desc) end rank
from t1
order by name
3.
select name,
score,
case when score >= 70 and score <=80 then 1 else rank() over(order by score desc) end rank
from t1
order by name
如果这三种情况时,有没有什么好办法
SELECT t.*,
RANK() OVER(ORDER BY CASE WHEN t.score >= 70 AND t.score <= 85 THEN NULL ELSE t.score END DESC)
FROM tb t
1。值范围(值>? and 值<?)
2。大于值或小于值(a.值>? b.值<?)
3.排序方式:asc或desc
这些参数都是客户自己随意设置的
如果上面的排序方式改成asc,就会有问题
insert into t1 values ('BB',85);
insert into t1 values ('CC',98);
insert into t1 values ('DD',58);
insert into t1 values ('EE',72);
insert into t1 values ('FF',83);
insert into t1 values ('GG',47);
commit;--1.
select name,
score,
case when score >= 70 then 1 else rank() over(order by score asc) end rank
from t1
order by rank;
结果:
/*
1 GG 47 1
2 EE 72 1
3 BB 85 1
4 CC 98 1
5 FF 83 1
6 DD 58 2
7 AA 67 3
*/
--分析错误:GG应该排第2(这里排在了第一),DD排第3,AA排第四
--2.
select name,
score,
case when score <= 70 then 1 else rank() over(order by score desc) end rank
from t1
order by rank;
/*
1 CC 98 1
2 GG 47 1
3 AA 67 1
4 DD 58 1
5 BB 85 2
6 FF 83 3
7 EE 72 4
--分析错误:CC应该排第2(这里排在了第一),BB排第3,FF排第4,EE排第5
*/
--3.
select name,
score,
case when score >= 70 and score <=80 then 1 else rank() over(order by score desc) end rank
from t1
order by name;
/*
1 AA 67 5
2 BB 85 2
3 CC 98 1
4 DD 58 6
5 EE 72 1
6 FF 83 3
7 GG 47 7
*/
--分析错误:CC应该排第2,以此类推总结:所有在条件之内的都排第一,然后再按照设定的asc或者desc对剩下的进行排序,排序从应该2开始
--1.
select name,
score,
case when score >= 70 then 1 else rank() over(order by score asc) end rank
from t1
order by rank;
改为
select name,
score,
case when score >= 70 then 1 else rank() over(order by score asc) + 1 end rank
from t1
order by rank;--2.
select name,
score,
case when score <= 70 then 1 else rank() over(order by score desc) end rank
from t1
order by rank;
改为
select name,
score,
case when score <= 70 then 1 else rank() over(order by score desc) + 1 end rank
from t1
order by rank;
--3.
select name,
score,
case when score >= 70 and score <=80 then 1 else rank() over(order by score desc) end rank
from t1
order by name;
改为
select name,
score,
case when score >= 70 and score <=80 then 1 else rank() over(order by score desc) + 1 end rank
from t1
order by name;
总结:
满足条件的全部排名为 1 ,剩下的排名还是正常排名从1开始(但要在后面再加1)
不管客户如何设置,这种做法都满足条件