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

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

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


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

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

В вашем случае просто count, на собеседовании задавать такой идиотский вопрос довольно странно.
...
Рейтинг: 0 / 0
16.10.2020, 16:11
    #40009290
x17.mstu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
graycode,
где count ?
...
Рейтинг: 0 / 0
16.10.2020, 16:14
    #40009292
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
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
16.10.2020, 16:29
    #40009296
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
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
16.10.2020, 16:35
    #40009299
кит северных морей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
... а теперь все дружно добавляем в тестовые данные select 0, 150 from dual и медитируем над разницей между rank и dense_rank.
...
Рейтинг: 0 / 0
16.10.2020, 16:53
    #40009306
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
кит северных морей,

Магию данных никто не отменял)) надеюсь топикстартер сам справится с задачей, принцип все равно тот же.
...
Рейтинг: 0 / 0
16.10.2020, 17:07
    #40009309
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
кит северных морей
... а теперь все дружно добавляем в тестовые данные 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
16.10.2020, 21:04
    #40009371
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
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
16.10.2020, 21:21
    #40009373
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
Упс, забыл что 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
16.10.2020, 21:24
    #40009374
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
Ну и если ANSI то поменять NVL на CASE.

SY.
...
Рейтинг: 0 / 0
16.10.2020, 21:28
    #40009376
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как функцию rank перезаписать через ansi sql ?
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как функцию rank перезаписать через ansi sql ? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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