ранжировать столбец с упорядочением в оракуле - PullRequest
3 голосов
/ 24 октября 2019

У меня есть данные, как показано ниже. Когда я применяю density_rank, упорядочивая столбец идентификатора, я получаю ранг в соответствии с порядком целых чисел, но мне нужно ранжировать, поскольку записи отображаются при выполнении запроса:

Данные из запроса:

Rid   id

8100  161
8101   2
8102   2
8103   2
8104  156

Когда я применяю плотность по заказу по идентификатору, тогда я получаю

Rid   id    rank

8100  161    3
8101   2     1
8102   2     1
8103   2     1
8104  156    2

Но мое требование заключается в следующем:

Rid   id    rank

8100  161    1
8101   2     2
8102   2     2
8103   2     2
8104  156    3

Использовал также row_number, но результат не такой, как ожидалось, не уверен, какой вариант будет лучше.

Любая помощь приветствуется.

Спасибо

Редактировать------------------------------

Используемый запрос

Select rid, id,dense_rank() over (order by id) row_num
from table

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Я настроил решение отсюда: DENSE_RANK в соответствии с конкретным заказом для вашей потребности.

Я не уверен, стоит ли отмечать это как дубликат, потому что по этой ссылке выше нетТег ORACLEЕсли больше опытных участников сочтут, что я должен сделать комментарий, я сделаю это и удалю этот ответ.

Вот скорректированный код и демонстрационная версия:

SELECT t2.rid
       , t2.id
       , DENSE_RANK() OVER (ORDER BY t2.max_rid)
FROM (
  SELECT MAX(t1.rid) OVER (PARTITION BY t1.grupa) AS max_rid
         , t1.rid
         , t1.id
  FROM (       
    SELECT rid
           , id
           ,ROW_NUMBER() OVER (ORDER BY rid) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY rid) AS grupa
    FROM test_table) t1 )  t2
ORDER BY rid

DEMO

1 голос
/ 24 октября 2019

Вы можете использовать sum() агрегацию, содержащую (order by rid) после получения значений из lag() аналитической функции в первом запросе

with tab( rid,id ) as
(
    select 8100,161 from dual union all              
    select 8101,2   from dual union all              
    select 8102,2   from dual union all              
    select 8103,2   from dual union all              
    select 8104,156 from dual
), t2 as 
   (
   select t.*, lag(id,1,0) over (order by rid) lg
     from tab t
   )
   select rid, id, sum(case when lg!=id then 1 else 0 end) over (order by rid) as row_num
     from t2

Демо

...