我有测试输入表
-----------------------
RN | IDs
1 | Az
2 | Azz
3 | B
4 | C
5 | a
6 | e
--------------------
我需要输出
----------
RN | IDs
4 | C
我需要获取在大写情况下的ID,并且单身(长度为1)以及ID应该按顺序最大化。像本例一样, C 是输出。 因为Size为1,所以大小写顺序为UPPER和MAX。 你能在这里帮我吗?
答案 0 :(得分:2)
第一步是确定您要考虑的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
中没有有关如何打破平局的信息。
答案 1 :(得分:0)
使用ASCII函数
select max(RN) as MAX_ID from yourTableName t1
where length(t1.IDs)=1 and ascii(IDs) between ascii('A') and ascii('Z');
答案 2 :(得分:0)
尝试一下:
if (Application.OpenForms().OfType<dspForm>.Any()){//Your Code }
答案 3 :(得分:0)
您可以通过这种方式来享受它,:)
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)
答案 4 :(得分:0)
首先过滤掉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