powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пронумеровать строки по определенному алгоритму
25 сообщений из 45, страница 1 из 2
Пронумеровать строки по определенному алгоритму
    #39635888
Уважаемые форумчане, добрый день
Прошу помочь, подсказать направление для решения такой задачи:

Код: 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.
-- creating table
CREATE TABLE ToyotaModels
(
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
(1, 'Toyota Yaris', 'Red', 22000),
(2, 'Toyota Yaris', 'Blue', 22300),
(3, 'Toyota Yaris', 'Black', 21800),
(4, 'Toyota Yaris', 'White', 22350),
(5, 'Toyota Yaris', 'Brass', 20990),
(6, 'Toyota Yaris', 'Silver', 22100),
(1, 'Toyota Camry', 'Black', 34600),
(2, 'Toyota Camry', 'Red', 34200),
(3, 'Toyota Camry', 'White', 34250),
(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),
(3, 'Toyota Corolla', 'Red', 25800),
(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),
(9, 'Toyota Corolla', 'Green', 24770),
(10,'Toyota Corolla', 'Camel', 25320),
(11, 'Toyota Corolla', 'Dark blue', 25650),
(12, 'Toyota Corolla', 'Dark tan', 24950)



Требуется пронумеровать строки таблицы так, чтобы сначала шли первые значения ID для моделей Toyota Yaris, Toyota Camry, Toyota Corolla, затем последние, затем опять первые и т. д. Результат должен быть таким, как на скриншоте.
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635899
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гордон Шамуэй,

Код: sql
1.
order by case CarModel  when 'Toyota'  then 1 when 'Lada' then 10 else 15 end
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635900
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavyГордон Шамуэй,

Код: sql
1.
order by case CarModel  when 'Toyota'  then 1 when 'Lada' then 10 else 15 end


главно никогда не читать того что просят
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635913
Фотография 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
Пронумеровать строки по определенному алгоритму
    #39635920
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гордон Шамуэй,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
With cte as (
Select *,
row_number() over (Partition by CarModel Order by ID) as rn,
row_number() over (Partition by CarModel Order by ID desc) as rn_desc
 From #ToyotaModels)
Select * From cte
Order by case When rn<rn_desc then rn else rn_desc end,
rn
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635925
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не взлетит
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635928
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю такой индекс будет только мешать: авторprimary key (ID, CarModel)
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635930
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaГордон Шамуэйчтобы сначала шли первые значения ID для моделей Toyota Yaris, Toyota Camry, Toyota Corolla, затем последние, затем опять первые и т. д.
Формально это в рамках одной группы (модели) соответствует такой сортировке:
Код: sql
1.
ORDER BY ABS(min_id+max_id-2*curr_id) DESC, curr_id ASC


Если реверсировать первое выражение, и добавить сортировку по модели - получится то, что требуется.
Код: 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.
DECLARE @Order TABLE(Id INT IDENTITY, Code VARCHAR(255) )
INSERT INTO @Order(Code)
VALUES ('Toyota Yaris'), ('Toyota Camry'), ('Toyota Corolla')

;WITH x as 
(
	SELECT  a.*, 
		MIN(a.Id) OVER (PARTITION BY CarModel) as min_id,
		MAX(a.Id) OVER (PARTITION BY CarModel) as max_id,
		b.Id as rnk
	FROM 
		ToyotaModels	a
	INNER JOIN
		@Order		b
	ON
		b.Code	= a.CarModel
),
y as 
(
SELECT 
*,
b= ROW_NUMBER() OVER (PARTITION BY CarModel ORDER BY rnk ,ABS(min_id+max_id-2*id)  DESC, Id ASC )
FROM x
)
SELECT 
	No = ROW_NUMBER() OVER (ORDER BY b,rnk),
	Id,
	CarModel,
	Color,
	Price
FROM y
ORDER BY b,rnk 


и в примере, как я понимаю ошибка в последних записях
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635932
Фотография 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
Пронумеровать строки по определенному алгоритму
    #39635935
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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



ну и далее сами
ценнейшая рекомендайция!

автордумаю такой индекс будет только мешать:
автор
primary key (ID, CarModel)

какой вы видите PK ?

авторWith cte as (
Select *,
row_number() over (Partition by CarModel Order by ID) as rn,
row_number() over (Partition by CarModel Order by ID desc) as rn_desc
From #ToyotaModels)
Select * From cte
Order by case When rn<rn_desc then rn else rn_desc end,
rn
ТЗ! какое ТЗ?
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635936
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю, как там в mssql, но вообще можно каждую модель засунуть в свою колонку и просто строками потом выбрать - 1,2,3 с каждой строки
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635937
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так понимаю студенты дипломы получили, или откуда такое нашествие ада
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39635946
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Будет работать в случае непрерывной последовательности "ToyotaModels.ID". При пропусках результат может быть некорректный.
Следует заменить
Код: sql
1.
2.
3.
4.
5.
6.
7.
....
1 as min_id,
count(*) OVER (PARTITION BY CarModel) as max_id,
ROW_number() Over (PARTITION BY CarModel Order by ID) as rn
.....
...ABS(min_id+max_id-2*rn),...
....
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636009
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, как вариант, при пропусках тоже ок:

Код: 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
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636019
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin, чтоб, сортировку первую убрать там еще индекс просится по ID, CarModel
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636020
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullinnullin, чтоб, сортировку первую убрать там еще индекс просится по ID, CarModel
OMG

авторprimary key (ID, CarModel)
или как-то покрасивее?
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636023
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО надо в консерватории что-нить подправить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE ToyotaModels
(
ID int NOT NULL IDENTITY(1,1) primary key,
CarModel varchar(20) NOT NULL,
Color varchar(20) NOT NULL,
Price money NOT NULL,
OrdNum int
)
ALTER TABLE ToyotaModels ADD  CONSTRAINT  UX_model_Color UNIQUE(CarModel,Color );
create index ix_OrdNum on ToyotaModels  (OrdNum );
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636024
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, Ок вопрос как к гуру:
scan+sort: http://sqlfiddle.com/#!18/f0c17/1
seek: http://sqlfiddle.com/#!18/4391d/1
Что лучше?
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636025
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того,
GoogleToyota Motor Company owns:
Lexus,
Scion,
Daihatsu and
Hino Motors, with a stake in Fuji Industries (Subaru's parent company)
and Isuzu


как вы себе представляете БД где на каждый бренд одна таблица? Адская ересь
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636026
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glebanski, это ТС троллит
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636027
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullinTaPaK, Ок вопрос как к гуру:
scan+sort: http://sqlfiddle.com/#!18/f0c17/1
seek: http://sqlfiddle.com/#!18/4391d/1
Что лучше?
это вы лукап в seek записали? :)
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636029
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK, Вы не ответили на вопрос)))
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636031
Glebanski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullinGlebanski, это ТС троллит
Блин, вот я лох...
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636034
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Код: sql
1.
2.
3.
;with a as (select max(id) as maxid, CarModel from ToyotaModels group by CarModel)
select tm.* from ToyotaModels tm join a on tm.CarModel = a.CarModel
order by case when tm.id % 2 = 1 then tm.id else a.maxid-tm.id+2 end, tm.CarModel
...
Рейтинг: 0 / 0
Пронумеровать строки по определенному алгоритму
    #39636043
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее
Код: sql
1.
2.
3.
4.
5.
6.
;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
order by b.mm, tm.CarModel
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пронумеровать строки по определенному алгоритму
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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