oracle 数据库查询排序问题

oracle 数据库查询排序问题,第1张

有个偷懒的方法

假设每个分割的数字不超过4位数

写个函数在通过分割获得数字,然后将所有的数字均补齐为4位,前面加'0'

再排序就正常了

------------------------------------

是我做的一个测试表的结果,第一个字段是测试数据

涉及的函数如下:

CREATE OR REPLACE FUNCTION GETNUM(str IN VARCHAR2)

RETURN NUMBER

IS

num NUMBER :=0;

p   NUMBER;

i   NUMBER :=2;

BEGIN

p := NVL(length(regexp_replace(str,'[^]','')),0);

WHILE p>1 and i<=p loop

BEGIN

num := num + TO_NUMBER(substr(str,instr(str,'',1,i-1)+1,instr(str,'',1,i)-instr(str,'',1,i-1)-1))GETBL(i);

i := i+1;

END;

END LOOP;

IF p = 0 THEN

num := TO_NUMBER(str);

ELSE IF p=1 THEN

num := TO_NUMBER(substr(str,1,instr(str,'',1,1)))+TO_NUMBER(substr(str,instr(str,'',1,1)+1));

ELSE

num := num+TO_NUMBER(substr(str,1,instr(str,'',1,1)))+TO_NUMBER(substr(str,instr(str,'',1,p)+1))GETBL(p+1);

END IF;

END IF;

RETURN num;

END;

-------

CREATE OR REPLACE FUNCTION GETBL(p IN NUMBER)

RETURN NUMBER

IS

num NUMBER := 1;

i NUMBER := 1 ;

BEGIN

WHILE i < p LOOP

BEGIN

num := num0001;

i := i+1;

END;

END LOOP;

RETURN num;

END;

代码如下:

SELECT

  ROW_NUMBER () OVER (ORDER BY english DESC) seq,

  name,

  sex,

  englishFROM

 '英语成绩表'

扩展资料

数据库排序函数:

row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号。

over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。

dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号。

rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

create table test1

(

id int,

name char(20),

rank varchar2(2),

primary key (id)

);

select from test1;

insert into test1(id,name,rank) values(1,'aa','甲');

insert into test1(id,name,rank) values(2,'bb','乙');

insert into test1(id,name,rank) values(3,'dd','丁');

insert into test1(id,name,rank) values(4,'cc','丙');

insert into test1(id,name,rank) values(5,'ee','乙');

--甲、乙、丙、丁、戊、己、庚、辛、壬、癸

select

from test1

order by (

case

when rank='甲' then 1

when rank='乙' then 2

when rank='丙' then 3

when rank='丁' then 4

when rank='戊' then 5

when rank='己' then 6

when rank='庚' then 7

when rank='辛' then 8

when rank='壬' then 9

when rank='癸' then 10

else 11

end

) asc,name asc;

select

from test1

order by decode(rank,

'甲',1,

'乙',2,

'丙',3,

'丁',4,

'戊',5,

'己',6,

'庚',7,

'辛',8,

'壬',9,

'癸',10,

11

) asc,name asc;

可以做到,对结果再一次分组呗,用分析函数,你这个第一行其实没有什么用,就是记录相同的第二列值是数以第几个,

select zaawdm ,

row_number() over(partition by zaawdm order by zaawdm ASC) XH

from table_name

这样就可以了,你的表列的名字起得太不规范了,看着都难受。

以上就是关于oracle 数据库查询排序问题全部的内容,包括:oracle 数据库查询排序问题、oracle 怎样给表中某个记录重复数据增加序号、Oracle查询数据怎么按照甲乙丙丁排序谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9627412.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存