powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пронумеровать строки по определенному алгоритму
20 сообщений из 45, страница 2 из 2
Пронумеровать строки по определенному алгоритму
    #39636056
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё точнее
Код: sql
1.
2.
3.
4.
5.
6.
7.
;with a as (select max(id) as maxid, CarModel from ToyotaModels group by CarModel),
b as (select max(maxid) as mm from a
union all
select mm-1 as mm from b where mm > 1)
select tm.* from ToyotaModels tm join a on tm.CarModel = a.CarModel join b on b.mm = case when b.mm %2 = 1 then (tm.id-1)*2+1 else (a.maxid - tm.id + 1)*2 end
and b.mm <= a.maxid
order by b.mm, tm.CarModel
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636061
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воронцов,

а теперь вот так проверьте результат:

Код: 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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
declare @ToyotaModels table
(
ID int NOT NULL,
CarModel varchar(20) NOT NULL,
Color varchar(20) NOT NULL,
Price money NOT NULL
primary key (ID, CarModel)
)

-- inserting test data
INSERT INTO @ToyotaModels
VALUES
(4, 'Toyota Corolla', 'Silver', 25100),
(5, 'Toyota Corolla', 'Black', 24900),
(6, 'Toyota Corolla', 'Apple Green', 25350),
(7, 'Toyota Corolla', 'Brass', 25700),
(8, 'Toyota Corolla', 'Aquamarine', 25900),
(1, 'Toyota Camry', 'Black', 34600),
(2, 'Toyota Camry', 'Red', 34200),
(3, 'Toyota Camry', 'White', 34250),
(1, 'Toyota Yaris', 'Red', 22000),
(4, 'Toyota Yaris', 'White', 22350),
(5, 'Toyota Yaris', 'Brass', 20990),
(6, 'Toyota Yaris', 'Silver', 22100),
(4, 'Toyota Camry', 'Blue', 33870),
(5, 'Toyota Camry', 'Silver', 33600),
(6, 'Toyota Camry', 'Camel', 33900),
(1, 'Toyota Corolla', 'White', 25230),
(2, 'Toyota Corolla', 'Yellow', 25400),
(2, 'Toyota Yaris', 'Blue', 22300),
(3, 'Toyota Yaris', 'Black', 21800),
(3, 'Toyota Corolla', 'Red', 25800),
(9, 'Toyota Corolla', 'Green', 24770),
(10,'Toyota Corolla', 'Camel', 25320),
(11, 'Toyota Corolla', 'Dark blue', 25650),
(12, 'Toyota Corolla', 'Dark tan', 24950)


;with a as (select max(id) as maxid, CarModel from @ToyotaModels group by CarModel),
b as (select max(maxid) as mm from a
union all
select mm-1 as mm from b where mm > 1)
select tm.* from @ToyotaModels tm join a on tm.CarModel = a.CarModel join b on b.mm = case when b.mm %2 = 1 then (tm.id-1)*2+1 else (a.maxid - tm.id + 1)*2 end
and b.mm <= a.maxid
order by b.mm, tm.CarModel
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636079
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

Ну уж перевести идентификатор в одинал - сами, сами... Чай не бином Ньютона
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636084
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ВоронцовKonst_One,

Ну уж перевести идентификатор в одинал - сами, сами... Чай не бином Ньютона

вот ТСу об этом и пытаемся донести
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636382
tip78думаю такой индекс будет только мешать: авторprimary key (ID, CarModel)

Вообще, в реальной жизни ToyotaModels это - результат выборки (CTE) из трех таблиц (Ярис, королла, камри)
Первичный ключ я здесь сделал, так сказать, для красоты.:)
А почему он может мешать?
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636383
Konst_Oneсортировка кастомная должна быть :
Код: sql
1.
2.
3.
4.
5.
6.
order by ID, 
case CarModel  
when 'Toyota Yaris' then 1
when 'Toyota Camry' then 2
when 'Toyota Corolla' then 3
else 0 end



ну и далее сами

Классный прием, спасибо. Буду иметь в виду
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636385
nullinKopelly, как вариант, при пропусках тоже ок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select 
row_number() over(order by case
                           when a.r < a.q - a.r + 1 then 2 * a.r - 1
                           when a.r = a.q - a.r + 1 then 2 * (a.q - a.r) + 1
                           when a.r > a.q - a.r + 1 then 2 * (a.q - a.r + 1)
                           end,
                           case a.CarModel  
                           when 'Toyota Yaris'   then 1
                           when 'Toyota Camry'   then 2
                           when 'Toyota Corolla' then 3
                           else                       0 
                           end) as rng,
a.ID, a.CarModel, a.Color, a.Price                          
from (select t.ID, t.CarModel, t.Color, t.Price,
             row_number() over(partition by t.CarModel order by t.ID) as r,
             sum(1) over(partition by t.CarModel) as q
from ToyotaModels as t) as a




Пытаюсь понять логику в первом CASE после THEN.

А почему вместо "a.r < a.q - a.r + 1" нельзя просто инвертировать порядок, как это предложил Kopelly :

Код: sql
1.
2.
row_number() over (Partition by CarModel Order by ID) as rn,
row_number() over (Partition by CarModel Order by ID desc) as rn_desc
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636388
Гордон Шамуэй
А почему вместо "a.r < a.q - a.r + 1"

Вернее, вместо того, чтобы суммировать кол-во строк по группе, и потом a.q - a.r + 1.
Правда, если задаешь прямую и обратную последовательность, в этой промежуточной выборке нарушается последовательность ID
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636396
nullinKopelly, как вариант, при пропусках тоже ок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select 
row_number() over(order by case
                           when a.r < a.q - a.r + 1 then 2 * a.r - 1
                           when a.r = a.q - a.r + 1 then 2 * (a.q - a.r) + 1
                           when a.r > a.q - a.r + 1 then 2 * (a.q - a.r + 1)
                           end,
                           case a.CarModel  
                           when 'Toyota Yaris'   then 1
                           when 'Toyota Camry'   then 2
                           when 'Toyota Corolla' then 3
                           else                       0 
                           end) as rng,
a.ID, a.CarModel, a.Color, a.Price                          
from (select t.ID, t.CarModel, t.Color, t.Price,
             row_number() over(partition by t.CarModel order by t.ID) as r,
             sum(1) over(partition by t.CarModel) as q
from ToyotaModels as t) as a



Нравится Ваше решение
Могли бы на пальцах объяснить логику:

Код: sql
1.
2.
3.
then 2 * a.r - 1
then 2 * (a.q - a.r) + 1
then 2 * (a.q - a.r + 1)



Как до этого вообще можно самому додуматься?)))
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636449
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гордон Шамуэй, q - quantity количество
По поводу логики: 2 * a.r - 1 вроде логично, 2 * (a.q - a.r + 1) - тоже.
А вот 2 * (a.q - a.r) + 1 появляется в единственном случае, когда количество нечетное.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636451
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гордон ШамуэйВообще, в реальной жизни ToyotaModels это - результат выборки (CTE) из трех таблиц (Ярис, королла, камри)
Первичный ключ я здесь сделал, так сказать, для красоты.:)
А почему он может мешать?

А этой темой, Вы решили пошебуршить улей? Впрочем вопрос - риторический.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636453
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гордон ШамуэйПытаюсь понять логику в первом CASE после THEN.

А почему вместо "a.r < a.q - a.r + 1" нельзя просто инвертировать порядок, как это предложил Kopelly :

Код: sql
1.
2.
row_number() over (Partition by CarModel Order by ID) as rn,
row_number() over (Partition by CarModel Order by ID desc) as rn_desc



Меньше ранжирующих операций, накладных расходов, но тяжелее понять потом, если этого трюка не иметь в закладках. По-этому действуйте с учетом того фактора, что потом(абстрактно, рассуждая) кому-то, может и самому потом поддерживать придется.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636461
nullin,

Все-таки, вот этот самый важный кусок я не понял(
Можете подробно расписать?

Код: sql
1.
2.
3.
when a.r < a.q - a.r + 1 then 2 * a.r - 1
when a.r = a.q - a.r + 1 then 2 * (a.q - a.r) + 1
when a.r > a.q - a.r + 1 then 2 * (a.q - a.r + 1)
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636462
nullinГордон ШамуэйВообще, в реальной жизни ToyotaModels это - результат выборки (CTE) из трех таблиц (Ярис, королла, камри)
Первичный ключ я здесь сделал, так сказать, для красоты.:)
А почему он может мешать?

А этой темой, Вы решили пошебуршить улей? Впрочем вопрос - риторический.

Да нет, действительно интересно чем может помешать первичный ключ.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636463
nullinГордон ШамуэйПытаюсь понять логику в первом CASE после THEN.

А почему вместо "a.r < a.q - a.r + 1" нельзя просто инвертировать порядок, как это предложил Kopelly :

Код: sql
1.
2.
row_number() over (Partition by CarModel Order by ID) as rn,
row_number() over (Partition by CarModel Order by ID desc) as rn_desc



Меньше ранжирующих операций, накладных расходов, но тяжелее понять потом, если этого трюка не иметь в закладках. По-этому действуйте с учетом того фактора, что потом(абстрактно, рассуждая) кому-то, может и самому потом поддерживать придется.

Насчет меньше накладных расходов - ок, но вот для легкости чтения кода - как по мне, такая прямая и обратная нумерация нагляднее, чем трюк с суммированием строк, вычитанием и прибавлением единицы.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636464
AkinaГордон Шамуэйчтобы сначала шли первые значения ID для моделей Toyota Yaris, Toyota Camry, Toyota Corolla, затем последние, затем опять первые и т. д.
Формально это в рамках одной группы (модели) соответствует такой сортировке:
Код: sql
1.
ORDER BY ABS(min_id+max_id-2*curr_id) DESC, curr_id ASC


Если реверсировать первое выражение, и добавить сортировку по модели - получится то, что требуется.

Какой интересный способ. Спасибо.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636468
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гордон Шамуэйnullin,

Все-таки, вот этот самый важный кусок я не понял(
Можете подробно расписать?

Код: sql
1.
2.
3.
when a.r < a.q - a.r + 1 then 2 * a.r - 1
when a.r = a.q - a.r + 1 then 2 * (a.q - a.r) + 1
when a.r > a.q - a.r + 1 then 2 * (a.q - a.r + 1)


a.r - прямая нумерация, a.q - a.r + 1 - это по сути обратная нумерация.
Каждая нечетная пронумерованная строчка будет на 2 позиции дальше предыдущей(1,3,5...), т.к. через раз берется ид с обратной стороны(2,4,6...) четные строки.
Так бы оно и шло, если бы интервал прямой нумерации не начал перекрывать интервал обратной - очевидно это ровно после пересечения середины таблицы произойдет (за 5 идет 7, там где уже 6 по нисходящей начинает идти обратная последовательность) - отсюда и сравнение.
На примере первый интервал 1,3,5 для строк 1,2,3; второй 2,4,6(см. снизу для камри) для 6,5,4.
Для нечетного количества строк, интервалы сойдутся в серединной строке, поэтому там можно взять результат для первого случая.
Кстати, пока вот это расписывал, понял, что одна строка в кейсе лишняя)))
Код: sql
1.
2.
when a.r <= a.q - a.r + 1 then 2 * a.r - 1
when a.r  > a.q - a.r + 1 then 2 * (a.q - a.r + 1)


Вот так надо.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636469
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поинтересуюсь, Гордон Шамуэй, а это у Вас тестовое задание такое на 5 минут, что-ли???
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636806
nullinГордон Шамуэйnullin,

Все-таки, вот этот самый важный кусок я не понял(
Можете подробно расписать?

Код: sql
1.
2.
3.
when a.r < a.q - a.r + 1 then 2 * a.r - 1
when a.r = a.q - a.r + 1 then 2 * (a.q - a.r) + 1
when a.r > a.q - a.r + 1 then 2 * (a.q - a.r + 1)


a.r - прямая нумерация, a.q - a.r + 1 - это по сути обратная нумерация.
Каждая нечетная пронумерованная строчка будет на 2 позиции дальше предыдущей(1,3,5...), т.к. через раз берется ид с обратной стороны(2,4,6...) четные строки.
Так бы оно и шло, если бы интервал прямой нумерации не начал перекрывать интервал обратной - очевидно это ровно после пересечения середины таблицы произойдет (за 5 идет 7, там где уже 6 по нисходящей начинает идти обратная последовательность) - отсюда и сравнение.
На примере первый интервал 1,3,5 для строк 1,2,3; второй 2,4,6(см. снизу для камри) для 6,5,4.
Для нечетного количества строк, интервалы сойдутся в серединной строке, поэтому там можно взять результат для первого случая.
Кстати, пока вот это расписывал, понял, что одна строка в кейсе лишняя)))
Код: sql
1.
2.
when a.r <= a.q - a.r + 1 then 2 * a.r - 1
when a.r  > a.q - a.r + 1 then 2 * (a.q - a.r + 1)


Вот так надо.

Спасибо большое)
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636810
nullinпоинтересуюсь, Гордон Шамуэй, а это у Вас тестовое задание такое на 5 минут, что-ли???

Задачка в целях обучения.
Да вот не на 5 минут:)
Два дня бился, потом решил обратиться к специалистам на этот форум)

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


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