[英]Extract Max single upper character from table in oracle
我有测试输入表
-----------------------
RN | IDs
1 | Az
2 | Azz
3 | B
4 | C
5 | a
6 | e
--------------------
我需要输出
----------
RN | IDs
4 | C
我需要获取在大写情况下的ID和single(length 1),并且ID应该按顺序最大。 像本例一样, C是输出 。 因为Size为1,所以大小写顺序为UPPER和MAX。 你能在这里帮我吗?
第一步是确定您要考虑的ids
值。 一种检查长度和字符范围的方法:
where length(ids) = 1
and ids between 'A' and 'Z'
这将对您的字符集做出一些假设,或者使用正则表达式也将做出一些假设:
where regexp_like(ids, '^[A-Z]$')
或最好不使用类,而不是使用固定范围:
where regexp_like(ids, '^[[:upper:]]$')
有了您的数据,其中任何一个都会给您两行,分别是B和C。
然后,您需要找到具有最大ids
值的行。 您可以进行自我连接,这有点浪费; 或使用子查询来计算排名列,然后对其进行过滤:
select rn, ids
from (
select rn, ids, rank() over (order by ids desc) as rnk
from your_table
where regexp_like(ids, '^[[:upper:]]$')
)
where rnk = 1;
RN IDS
---------- ---
4 C
或者您可以将max()
函数的变体与last
一起使用来一步完成:
select max(rn) keep (dense_rank last order by IDs) as rn, max(ids)
from your_table
where regexp_like(ids, '^[[:upper:]]$');
RN MAX
---------- ---
4 C
你还没有说,如果出现平局,例如两个应该发生什么rn
与价值观C
。 这些方法中的第一种将向您显示两种方法-但如果可以指定要查看的方法,则可以将其修改为仅显示一种方法。 第二个只会显示一个,而目前尚不确定,因为该order by
没有有关如何打平领带的信息。
使用ASCII函数
select max(RN) as MAX_ID from yourTableName t1
where length(t1.IDs)=1 and ascii(IDs) between ascii('A') and ascii('Z');
尝试这个:
SELECT MAX(RN) FROM test
WHERE LENGTH(ID)=1 AND (UNICODE(ID) != UNICODE(LOWER(ID))
GROUP BY ID;
您可以通过这种方式来享受它:)
select h.ID, h.DESC
from test_table h
where length(h.DESC) = 1
and upper(h.DESC) = h.DESC
and h.ID = (select MAX(y.ID)
from test_table y
where length(y.DESC) = 1
and upper(y.DESC) = y.DESC)
首先过滤掉length(IDs)=1
足够了,并按decode(upper(IDs),IDs,0,1), IDs desc
select RN , IDs
from
(
select t.*,
row_number() over (order by decode(upper(IDs),IDs,0,1), IDs desc )
as rn2
from t
where length(IDs)=1
)
where rn2 = 1;
RN IDS
----- -----
4 C
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.