powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / можно ли как-то попроще ? (аналитика?)
6 сообщений из 6, страница 1 из 1
можно ли как-то попроще ? (аналитика?)
    #39486776
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо пересортировать номера, каждому старому присвоить новый в соответствии с неким порядком
(в данном случае обратный порядок, но может быть любой)

написал вот так пока

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with a as
(
select 22 as old_rank, 4 base from dual union all
select 44 as old_rank, 3 base from dual union all
select 66 as old_rank, 2 base from dual union all
select 88 as old_rank, 1 base from dual
)
, a1 as
(
  select a.*
        , row_number() over(order by base) as rn
        , count(*) over() as cnt
  from a
)
select 
   a1.old_rank        
  ,(
    select min(aa.old_rank)
    from a1 aa      
    where aa.base <= a1.cnt - a1.rn + 1
   ) as new_rank
from a1
order by old_rank



тут результат корректный вроде

OLD_RANK NEW_RANK1 22 882 44 663 66 444 88 22

можно ли как-то чтоб поменьше подзапросов ?
может как-то select min(aa.old_rank) на аналитику поменять ?
(я не допер пока как, с окнами как-то не вышло)
...
Рейтинг: 0 / 0
можно ли как-то попроще ? (аналитика?)
    #39486785
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nxx, результат перепутан (не соответствует примеру)?
...
Рейтинг: 0 / 0
можно ли как-то попроще ? (аналитика?)
    #39486789
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with a as
(
select 22 as old_rank, 4 base from dual union all
select 44 as old_rank, 3 base from dual union all
select 66 as old_rank, 2 base from dual union all
select 88 as old_rank, 1 base from dual
),
old_order as
(select a.*, row_number () over (order by old_rank) rn
 from a
),
new_order as
(select a.*, row_number () over (order by base) rn
 from a
)
select t1.old_rank, t1.base, t2.old_rank as new_rank
from       old_order t1
inner join new_order t2 on t1.rn = t2.rn;

  OLD_RANK       BASE   NEW_RANK
---------- ---------- ----------
        22          4         88
        44          3         66
        66          2         44
        88          1         22
...
Рейтинг: 0 / 0
можно ли как-то попроще ? (аналитика?)
    #39486798
nxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

спасибо, похоже то что нужно
...
Рейтинг: 0 / 0
можно ли как-то попроще ? (аналитика?)
    #39486820
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RTFM nth_value
...
Рейтинг: 0 / 0
можно ли как-то попроще ? (аналитика?)
    #39486829
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicRTFM nth_valueИ правда. Совсем отстал от жизни.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with a as
(
select 22 as old_rank, 4 base from dual union all
select 44 as old_rank, 3 base from dual union all
select 66 as old_rank, 2 base from dual union all
select 88 as old_rank, 1 base from dual
)
select a.*, nth_value(old_rank, base) over (order by base rows between unbounded preceding and unbounded following) new_rank
from a;

  OLD_RANK       BASE   NEW_RANK
---------- ---------- ----------
        88          1         88
        66          2         66
        44          3         44
        22          4         22


nxx, если base-сортировка задается каким-то выражением, то посчитаешь ее в inline-view row_number-ом.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / можно ли как-то попроще ? (аналитика?)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]