Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пронумеровать строки по определенному алгоритму / 25 сообщений из 45, страница 1 из 2
25.04.2018, 10:52
    #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
25.04.2018, 11:12
    #39635899
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
Гордон Шамуэй,

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

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


главно никогда не читать того что просят
...
Рейтинг: 0 / 0
25.04.2018, 11:29
    #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
25.04.2018, 11:38
    #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
25.04.2018, 11:41
    #39635925
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
не взлетит
...
Рейтинг: 0 / 0
25.04.2018, 11:45
    #39635928
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
думаю такой индекс будет только мешать: авторprimary key (ID, CarModel)
...
Рейтинг: 0 / 0
25.04.2018, 11:48
    #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
25.04.2018, 11:50
    #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
25.04.2018, 11:51
    #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
25.04.2018, 11:51
    #39635936
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
я не знаю, как там в mssql, но вообще можно каждую модель засунуть в свою колонку и просто строками потом выбрать - 1,2,3 с каждой строки
...
Рейтинг: 0 / 0
25.04.2018, 11:52
    #39635937
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
я так понимаю студенты дипломы получили, или откуда такое нашествие ада
...
Рейтинг: 0 / 0
25.04.2018, 11:59
    #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
25.04.2018, 13:32
    #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
25.04.2018, 13:44
    #39636019
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
nullin, чтоб, сортировку первую убрать там еще индекс просится по ID, CarModel
...
Рейтинг: 0 / 0
25.04.2018, 13:46
    #39636020
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
nullinnullin, чтоб, сортировку первую убрать там еще индекс просится по ID, CarModel
OMG

авторprimary key (ID, CarModel)
или как-то покрасивее?
...
Рейтинг: 0 / 0
25.04.2018, 13:52
    #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
25.04.2018, 13:53
    #39636024
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
TaPaK, Ок вопрос как к гуру:
scan+sort: http://sqlfiddle.com/#!18/f0c17/1
seek: http://sqlfiddle.com/#!18/4391d/1
Что лучше?
...
Рейтинг: 0 / 0
25.04.2018, 13:56
    #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
25.04.2018, 13:58
    #39636026
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
Glebanski, это ТС троллит
...
Рейтинг: 0 / 0
25.04.2018, 13:58
    #39636027
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
nullinTaPaK, Ок вопрос как к гуру:
scan+sort: http://sqlfiddle.com/#!18/f0c17/1
seek: http://sqlfiddle.com/#!18/4391d/1
Что лучше?
это вы лукап в seek записали? :)
...
Рейтинг: 0 / 0
25.04.2018, 14:01
    #39636029
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
TaPaK, Вы не ответили на вопрос)))
...
Рейтинг: 0 / 0
25.04.2018, 14:02
    #39636031
Glebanski
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пронумеровать строки по определенному алгоритму
nullinGlebanski, это ТС троллит
Блин, вот я лох...
...
Рейтинг: 0 / 0
25.04.2018, 14:04
    #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
25.04.2018, 14:15
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пронумеровать строки по определенному алгоритму / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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