从oracle中的表中提取Max单个高位字符

时间:2018-12-17 10:31:13

标签: sql oracle

我有测试输入表

-----------------------
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。 你能在这里帮我吗?

5 个答案:

答案 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  

您还没有说过如果打成平局该怎么办,例如两个rnC的值。这些方法中的第一种将向您显示两种方法-但如果可以指定要查看的方法,则可以将其修改为仅显示一种方法。第二个将只向您显示一个,而这是不确定的,因为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

Rextester Demo