Извлечь Макс одного верхнего символа из таблицы в оракуле - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть тестовая таблица ввода

-----------------------
RN | IDs
1  | Az
2  | Azz
3  | B
4  | C
5  | a
6  | e
--------------------

Мне нужен вывод

----------
RN | IDs
4  |  C

Мне нужно получить Id, который находится в верхнем регистре и один (длина 1) также, что ID должен быть макс.по порядку.Как и в этом примере, C - это output .Поскольку Размер равен 1, регистр ВЕРХНИЙ и МАКС. В последовательности.Можете ли вы помочь мне здесь.

Ответы [ 5 ]

0 голосов
/ 17 декабря 2018

Сначала достаточно отфильтровать 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

0 голосов
/ 17 декабря 2018

Вы можете сделать это таким образом, наслаждайтесь:)

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)
0 голосов
/ 17 декабря 2018

Попробуйте это:

SELECT MAX(RN) FROM test
WHERE LENGTH(ID)=1 AND (UNICODE(ID) != UNICODE(LOWER(ID))
GROUP BY ID;
0 голосов
/ 17 декабря 2018

Первым шагом является определение 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 нет информации о том, как разорвать связь.

0 голосов
/ 17 декабря 2018

Используйте функцию ASCII

select max(RN) as MAX_ID from yourTableName t1
where length(t1.IDs)=1 and  ascii(IDs)  between ascii('A') and  ascii('Z');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...