powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как функцию rank перезаписать через ansi sql ?
17 сообщений из 17, страница 1 из 1
Как функцию rank перезаписать через ansi sql ?
    #40009267
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select id, points , rank() ( order by points desc ) rn from competition
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009269
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
x17.mstu,

Что именно вам надо?
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009276
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

id points status
1 50 3
2 100 2
3 150 1
4 30 4
5 30 4


Вывести столбец status
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009277
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем её переписывать? Она, как и остальные оконные функции, входят в стандарт ANSI SQL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009281
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

попросили на собес
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009282
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009287
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x17.mstu,

В вашем случае просто count, на собеседовании задавать такой идиотский вопрос довольно странно.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009290
x17.mstu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,
где count ?
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009292
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x17.mstu,

От сгруппированной по points выборке

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t (id, points) as
(
              select 1, 50 from dual
    union all select 2, 100 from dual
    union all select 3, 150 from dual
    union all select 4, 30 from dual
    union all select 5, 30 from dual
)
, tg (points) as
(
    select points from t group by points
)
select id, points
     , (select count(*) + 1 from tg where tg.points > t.points) rnk
  from t
 order by rnk, id
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009296
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
graycode,

distinct

Код: 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.
SQL> ed
Wrote file afiedt.buf

  1  with t (id, points) as
  2  (
  3                select 1, 50 from dual
  4      union all select 2, 100 from dual
  5      union all select 3, 150 from dual
  6      union all select 4, 30 from dual
  7      union all select 5, 30 from dual
  8  )
  9  select id, points
 10       , (select count(distinct points)  from t tg where tg.points >= t.points) rnk
 11    from t
 12*  order by rnk, id
SQL> /

        ID     POINTS        RNK
---------- ---------- ----------
         3        150          1
         2        100          2
         1         50          3
         4         30          4
         5         30          4



....
stax
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009299
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... а теперь все дружно добавляем в тестовые данные select 0, 150 from dual и медитируем над разницей между rank и dense_rank.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009306
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кит северных морей,

Магию данных никто не отменял)) надеюсь топикстартер сам справится с задачей, принцип все равно тот же.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009309
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кит северных морей
... а теперь все дружно добавляем в тестовые данные select 0, 150 from dual и медитируем над разницей между rank и dense_rank.

увидел
но уже поздно
смотрел на пример graycode (скрипт)

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SQL> ed
Wrote file afiedt.buf

  1  with t (id, points) as
  2  (
  3                select 1, 50 from dual
  4      union all select 2, 100 from dual
  5      union all select 3, 150 from dual
  6      union all select 4, 30 from dual
  7      union all select 4, 30 from dual
  8      union all select 6, 3 from dual
  9      union all select 5, 30 from dual
 10  )
 11  /*
 12  select id, points
 13     , rank() over ( order by points desc ) rn
 14  from t
 15  order by rn, id
 16  */
 17  select id, points
 18      , (select count(points)+1  from t tg where tg.points > t.points) rnk
 19  from t
 20* order by rnk, id
SQL> /

        ID     POINTS        RNK
---------- ---------- ----------
         3        150          1
         2        100          2
         1         50          3
         4         30          4
         4         30          4
         5         30          4
         6          3          7

7 rows selected.

SQL>



.....
stax
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009371
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Не забываем про NULL:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
with t (id, points) as (
                        select 1, 50 from dual union all
                        select 2, 100 from dual union all
                        select 3, 150 from dual union all
                        select 4, 30 from dual union all
                        select 4, 30 from dual union all
                        select 6, 3 from dual union all
                        select 5, 30 from dual union all
                        select 7, null from dual union all
                        select 8, null from dual
                       )
select  id,
        points,
        (select count(points)+1 from t tg where tg.points > t.points) rnk
  from t
  order by rnk, id
/

        ID     POINTS        RNK
---------- ---------- ----------
         3        150          1
         7                     1
         8                     1
         2        100          2
         1         50          3
         4         30          4
         4         30          4
         5         30          4
         6          3          7

9 rows selected.

SQL>



Корректируем:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
with t (id, points) as (
                        select 1, 50 from dual union all
                        select 2, 100 from dual union all
                        select 3, 150 from dual union all
                        select 4, 30 from dual union all
                        select 4, 30 from dual union all
                        select 6, 3 from dual union all
                        select 5, 30 from dual union all
                        select 7, null from dual union all
                        select 8, null from dual
                       )
select  id,
        points,
        (select count(points)+1 from t tg where tg.points > t.points or t.points is null) rnk
  from t
  order by rnk, id
/

        ID     POINTS        RNK
---------- ---------- ----------
         3        150          1
         2        100          2
         1         50          3
         4         30          4
         4         30          4
         5         30          4
         6          3          7
         7                     8
         8                     8

9 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009373
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, забыл что DESC и NULL идет первым:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
with t (id, points) as (
                        select 1, 50 from dual union all
                        select 2, 100 from dual union all
                        select 3, 150 from dual union all
                        select 4, 30 from dual union all
                        select 4, 30 from dual union all
                        select 6, 3 from dual union all
                        select 5, 30 from dual union all
                        select 7, null from dual union all
                        select 8, null from dual
                       )
select  id,
        points,
        (select count(*) + 1 from t tg where nvl(tg.points,t.points + 1) > t.points) rnk
  from t
  order by rnk,
           id
/

        ID     POINTS        RNK
---------- ---------- ----------
         7                     1
         8                     1
         3        150          3
         2        100          4
         1         50          5
         4         30          6
         4         30          6
         5         30          6
         6          3          9

9 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009374
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и если ANSI то поменять NVL на CASE.

SY.
...
Рейтинг: 0 / 0
Как функцию rank перезаписать через ansi sql ?
    #40009376
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ANSI:

Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
with t (id, points) as (
                        select 1, 50 from dual union all
                        select 2, 100 from dual union all
                        select 3, 150 from dual union all
                        select 4, 30 from dual union all
                        select 4, 30 from dual union all
                        select 6, 3 from dual union all
                        select 5, 30 from dual union all
                        select 7, null from dual union all
                        select 8, null from dual
                       )
select  id,
        points,
        rnk
  from      t
        cross apply(
                    select  count(*) + 1 rnk
                      from  t tg
                      where case
                              when tg.points is null then t.points + 1
                              else tg.points
                            end > t.points
                   ) x
  order by rnk,
           id
/

        ID     POINTS        RNK
---------- ---------- ----------
         7                     1
         8                     1
         3        150          3
         2        100          4
         1         50          5
         4         30          6
         4         30          6
         5         30          6
         6          3          9

9 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как функцию rank перезаписать через ansi sql ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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