Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с "хитрой" сортировкой  [new]
WGA
Member

Откуда:
Сообщений: 408
Доброго дня!

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

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);
Ожидаемый результат
ID     PRIORITY
1 1
2 2
9 9
8 8
3 3
4 4
7 7
6 6
5 5
Как добиться желаемого упорядочивания? Что-то уже голову сломал...
12 ноя 20, 15:10    [22230807]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с "хитрой" сортировкой  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Ну если влоб, то
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
12 ноя 20, 16:34    [22230899]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с "хитрой" сортировкой  [new]
WGA
Member

Откуда:
Сообщений: 408
Akina,

А если количество выборки с "головы" и "хвоста" может отличаться? Например, 3 с высшим приоритетом, а потом 5 с низшим.
12 ноя 20, 17:20    [22230967]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с "хитрой" сортировкой  [new]
court
Member

Откуда:
Сообщений: 2160
WGA
Например, 3 с высшим приоритетом, а потом 5 с низшим.

;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

idpriorityrn
991
881
771
111
221
331
441
551
662
12 ноя 20, 17:36    [22230992]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с "хитрой" сортировкой  [new]
WGA
Member

Откуда:
Сообщений: 408
Блин, а ведь еще по мере обработки происходит выбывание заявок из очереди. А порядок должен остаться корректным, т.е. если выбывают Заявки с ID = 1 и 2, то следующая должна стать именно 9.
12 ноя 20, 17:36    [22230993]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с "хитрой" сортировкой  [new]
WGA
Member

Откуда:
Сообщений: 408
court,

Выглядит правдоподобно, ушел переваривать и думать на тему, как обеспечить детерминированный порядок.
12 ноя 20, 18:29    [22231036]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить