powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитика. Перемещение записи в конец отсортированного набора
7 сообщений из 7, страница 1 из 1
Аналитика. Перемещение записи в конец отсортированного набора
    #39309225
kas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kas
Гость
Добрый день, господа.

Помоги, пожалуйста, решить задачу, сам что-то я не соображу никак.

Есть отсортированный набор:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with T as
(
select 30 cnt, 1 priority, 'vasya' name, 0 flag from dual 
union all
select 29 cnt, 1 priority, 'petya' name, 1 flag from dual 
union all
select 28 cnt, 1 priority, 'oleg'  name, 0 flag from dual 
union all
select 20 cnt, 1 priority, 'misha' name, 0 flag from dual 
union all
select 10 cnt, 1 priority, 'egor'  name, 1 flag from dual 
union all
select 5  cnt, 1 priority, 'smit'  name, 1 flag from dual 
)
select cnt, priority, name, flag
from T
order by cnt desc, priority



его результат:
Код: sql
1.
2.
3.
4.
5.
6.
7.
   	CNT	PRIORITY	NAME	FLAG
1	30	1	vasya	0
2	29	1	petya	1
3	28	1	oleg	0
4	20	1	misha	0
5	10	1	egor	1
6	5	1	smit	1



Что нужно добавить в запрос, что бы последняя запись у которой FLAG = 0 переместилась в самый конец,
т.е. условие такое: "Если после сортировки набора по "полю CNT по убыванию и полю PRIORITY по возрастанию" последняя строка имеет FLAG равный 1, то в конец набора перемещается последняя строка, у которой FLAG равен 0".
Т.е. результатом должно стать это:

Код: sql
1.
2.
3.
4.
5.
6.
7.
   	CNT	PRIORITY	NAME	FLAG
1	30	1	vasya	0
2	29	1	petya	1
3	28	1	oleg	0
4	10	1	egor	1
5	5	1	smit	1
6	20	1	misha	0



Понимаю, что нужно использовать LAST_VALUE, но как придумать не могу.

Буду благодарен любым идеям.
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309249
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kas,

(примерно) так
Код: 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 T as
(
select 30 cnt, 1 priority, 'vasya' name, 0 flag from dual 
union all
select 29 cnt, 1 priority, 'petya' name, 1 flag from dual 
union all
select 28 cnt, 1 priority, 'oleg'  name, 0 flag from dual 
union all
select 20 cnt, 1 priority, 'misha' name, 0 flag from dual 
union all
select 10 cnt, 1 priority, 'egor'  name, 1 flag from dual 
union all
select 5  cnt, 1 priority, 'smit'  name, 1 flag from dual 
)
  select cnt, priority, name, flag
        ,case when flag=0 
                   and row_number() over (partition by flag order by cnt desc, priority)
                      =    count(*) over (partition by flag)
               then 
                1
              end as ff
    from T
order by ff desc,cnt desc, priority
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309255
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawish(примерно) так
Код: plsql
1.
2.
3.
                   and row_number() over (partition by flag order by cnt desc, priority)
                      =    count(*) over (partition by flag)
 


А развернуть сортировку и взять row_number = 1 не?
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309263
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kasПонимаю, что нужно использовать LAST_VALUE, но как придумать не могу.
Код: plsql
1.
order by case when count(nullif(flag, 1)) over (order by cnt desc, priority rows between 1 following and unbounded following) = 0 and flag = 0 then 2 else 1 end, …

Код: plsql
1.
         case when lead(flag) over (partition by flag order by cnt desc, priority) is null and flag = 0 then 2 else 1 end as ord
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309276
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
         lead(1, 1, nullif(flag, 0)) over (partition by flag order by cnt desc, priority),
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309278
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousorawish(примерно) так
Код: plsql
1.
2.
3.
                   and row_number() over (partition by flag order by cnt desc, priority)
                      =    count(*) over (partition by flag)
 


А развернуть сортировку и взять row_number = 1 не?
конечно, однако, особливо под вечер, проще код копипастить, чем лишний раз думать головой
:)
...
Рейтинг: 0 / 0
Аналитика. Перемещение записи в конец отсортированного набора
    #39309289
kas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kas
Гость
orawishandrey_anonymousпропущено...

А развернуть сортировку и взять row_number = 1 не?
конечно, однако, особливо под вечер, проще код копипастить, чем лишний раз думать головой
:)

Спасибо, orawish и andrey_anonymous, сортировку развернуть это уж я осилю):
Код: sql
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.
with T as
(
select 30 cnt, 1 priority, 'vasya' name, 0 flag from dual 
union all
select 29 cnt, 1 priority, 'petya' name, 1 flag from dual 
union all
select 28 cnt, 1 priority, 'oleg'  name, 0 flag from dual 
union all
select 20 cnt, 1 priority, 'misha' name, 0 flag from dual 
union all
select 10 cnt, 1 priority, 'egor'  name, 1 flag from dual 
union all
select 5  cnt, 1 priority, 'smit'  name, 1 flag from dual 
)
  select cnt, priority, name, flag,
         row_number() over (partition by flag order by cnt, priority desc),
--/*
        case when flag=0 
                   and row_number() over (partition by flag order by cnt, priority desc)
                      =    1--count(*) over (partition by flag)
               then 
                1
              end as ff
--*/              
    from T
order by ff desc,
         cnt desc, priority



Elic, вот это я сразу не могу осмыслить, мне надо время):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with T as
(
select 30 cnt, 1 priority, 'vasya' name, 0 flag from dual 
union all
select 29 cnt, 1 priority, 'petya' name, 1 flag from dual 
union all
select 28 cnt, 1 priority, 'oleg'  name, 0 flag from dual 
union all
select 20 cnt, 1 priority, 'misha' name, 0 flag from dual 
union all
select 10 cnt, 1 priority, 'egor'  name, 1 flag from dual 
union all
select 5  cnt, 1 priority, 'smit'  name, 1 flag from dual 
)
select cnt, priority, name, flag
from T
order by case when count(nullif(flag, 1)) over (order by cnt desc, priority rows between 1 following and unbounded following) = 0 and flag = 0 then 2 else 1 end,
         cnt desc, priority



ну а это просто класс:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with T as
(
select 30 cnt, 1 priority, 'vasya' name, 0 flag from dual 
union all
select 29 cnt, 1 priority, 'petya' name, 1 flag from dual 
union all
select 28 cnt, 1 priority, 'oleg'  name, 0 flag from dual 
union all
select 20 cnt, 1 priority, 'misha' name, 0 flag from dual 
union all
select 10 cnt, 1 priority, 'egor'  name, 1 flag from dual 
union all
select 5  cnt, 1 priority, 'smit'  name, 1 flag from dual 
)
select cnt, priority, name, flag
from T
order by lead(1, 1, nullif(flag, 0)) over (partition by flag order by cnt desc, priority),
         cnt desc, priority



Вообще, 100 лет не заходил на форум, а зря, тут все те же профи и всегда помогут. Спасибо вам!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Аналитика. Перемещение записи в конец отсортированного набора
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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