Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос с "хитрой" сортировкой / 6 сообщений из 6, страница 1 из 1
12.11.2020, 15:10
    #40017540
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
Доброго дня!

Такая задача, сильно упрощенно. Есть заявки с неким числовым приоритетом. Необходимо упорядочить в запросе их таким образом, чтобы первыми шли 2 заявки с низшим приоритетом, потом 2 самые высших и т.д.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table app_idx (
    id int,
    priority int,
    constraint pk_app_idx primary key (id)
);

insert into app_idx values(1, 1);
insert into app_idx values(2, 2);
insert into app_idx values(3, 3);
insert into app_idx values(4, 4);
insert into app_idx values(5, 5);
insert into app_idx values(6, 6);
insert into app_idx values(7, 7);
insert into app_idx values(8, 8);
insert into app_idx values(9, 9);

Ожидаемый результат
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ID     PRIORITY
1      1
2      2
9      9
8      8
3      3
4      4
7      7
6      6
5      5
Как добиться желаемого упорядочивания? Что-то уже голову сломал...
...
Рейтинг: 0 / 0
12.11.2020, 16:34
    #40017587
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
Ну если влоб, то
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH cte AS ( SELECT *,
                     (ROW_NUMBER() OVER (ORDER BY priority ASC) + 1) / 2 rn1,
                     (ROW_NUMBER() OVER (ORDER BY priority DESC) + 1) / 2 rn2
              FROM app_idx ) 
SELECT * 
FROM cte
ORDER BY CASE WHEN rn1 < rn2 THEN rn1 ELSE rn2 END,
         CASE WHEN rn1 < rn2 THEN 1 ELSE 2 END,
         CASE WHEN rn1 < rn2 THEN id ELSE -id END

fiddle
...
Рейтинг: 0 / 0
12.11.2020, 17:20
    #40017621
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
Akina,

А если количество выборки с "головы" и "хвоста" может отличаться? Например, 3 с высшим приоритетом, а потом 5 с низшим.
...
Рейтинг: 0 / 0
12.11.2020, 17:36
    #40017642
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
WGA
Например, 3 с высшим приоритетом, а потом 5 с низшим.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
;with cte as (
	select 
		*
		,(row_number()over(order by priority desc)+(3-1)) / 3 as rn
	from app_idx 
	where priority > 5

	union all

	select 
		*
		,(row_number()over(order by priority)+(5-1)) / 5 as rn
	from app_idx 
	where priority <= 5)
select * from cte
order by rn, case when priority <= 5 then 1 else 0 end, case when priority > 5 then -priority else priority end


idpriorityrn991881771111221331441551662
...
Рейтинг: 0 / 0
12.11.2020, 17:36
    #40017643
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
Блин, а ведь еще по мере обработки происходит выбывание заявок из очереди. А порядок должен остаться корректным, т.е. если выбывают Заявки с ID = 1 и 2, то следующая должна стать именно 9.
...
Рейтинг: 0 / 0
12.11.2020, 18:29
    #40017668
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с "хитрой" сортировкой
court,

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


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