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

Откуда: Москва
Сообщений: 598
Версия:
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)   Sep 21 2011 22:45:45   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 


Есть такая таблица:

Artikulidentifiername
A1X
A2X
A3X
A4B
A5C
B8T
B8K
B9T
B9K
B15T
B15K
B20A
B20G
B21L
B21M
B21N


Мне нужно сделать дистинкт таким образом, где поле Rang получается путем ранжирующей функции

ArtikulnameRang
AX1
AB2
AC3
BT4
BK4
BA5
BG5
BL6
BM6
BN6
13 ноя 14, 12:00    [16839107]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
minya13_85
AB2
AC3


что вы там ранжируете и по каким правилам?
13 ноя 14, 12:02    [16839122]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
select top 1 with ties * from MyTable
order by row_number() over (partition by Artikul, name order by identifier)
13 ноя 14, 12:03    [16839129]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
Knyazev Alexey
select top 1 with ties * from MyTable
order by row_number() over (partition by Artikul, name order by identifier)


разве там будут эти значения?

minya13_85
BT4
BK4
13 ноя 14, 12:06    [16839156]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Konst_One, таблица 1, она очень большая. там много записей из-за того, что у одного Артикул (Artikul) много изделий (identifier) различных, бывают с одинаковыми вставками (name), бывают с разными, может как одна вставка в Артикуле быть, так и несколько.
Хочу написать такой дистинкт, где я уберу Изделия(identifier) и оставлю Артикул (Artikul) и Вставки (name). Но чтобы понимать, что в этом конкретном Артикуле, Есть такие-то вставки, если там две вставки или более, то это тоже видеть. Соответственно нужен ранг по изделию, где он будет один, значит в этом изделии одна вставка и она такая, если Ранг повторится, то значит в этом изделии столько вставок, сколько повторился этот Ранг.
13 ноя 14, 12:10    [16839195]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Konst_One
Knyazev Alexey
select top 1 with ties * from MyTable
order by row_number() over (partition by Artikul, name order by identifier)



разве там будут эти значения?

minya13_85
BT4
BK4


Зануда доделать-то уже копейки:

select Artikul, name, dense_rank() over (order by identifier) as Rang  
from
(
select top 1 with ties * from MyTable
order by row_number() over (partition by Artikul, name order by identifier)
) t
13 ноя 14, 12:10    [16839210]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
declare @t table (Artikul varchar(1),identifier int, name varchar(1))

insert into @t (Artikul, identifier, name)
select 'A',	1,	'X'
union all select 'A',	2,	'X'
union all select 'A',	3,	'X'
union all select 'A',	4,	'B'
union all select 'A',	5,	'C'
union all select 'B',	8,	'T'
union all select 'B',	8,	'K'
union all select 'B',	9,	'T'
union all select 'B',	9,	'K'
union all select 'B',	15,	'T'
union all select 'B',	15,	'K'
union all select 'B',	20,	'A'
union all select 'B',	20,	'G'
union all select 'B',	21,	'L'
union all select 'B',	21,	'M'
union all select 'B',	21,	'N';

select * from @t;

select top 1 with ties * from @t
order by row_number() over (partition by Artikul, name order by identifier);


пусть ТС уточнит правила ранжирования
13 ноя 14, 12:12    [16839227]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
Knyazev Alexey
Konst_One
пропущено...


разве там будут эти значения?

пропущено...


Зануда доделать-то уже копейки:

select Artikul, name, dense_rank() over (order by identifier) as Rang  
from
(
select top 1 with ties * from MyTable
order by row_number() over (partition by Artikul, name order by identifier)
) t


вот, это то , что ТС хотел
13 ноя 14, 12:13    [16839239]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Konst_One,
declare @t table (Artikul varchar(1),identifier int, name varchar(1))

insert into @t (Artikul, identifier, name)
select 'A',	1,	'X'
union all select 'A',	2,	'X'
union all select 'A',	3,	'X'
union all select 'A',	4,	'B'
union all select 'A',	5,	'C'
union all select 'B',	8,	'T'
union all select 'B',	8,	'K'
union all select 'B',	9,	'T'
union all select 'B',	9,	'K'
union all select 'B',	12,	'T'
union all select 'B',	12,	'P'
union all select 'B',	16,	'T'
union all select 'B',	16,	'R'
union all select 'B',	15,	'T'
union all select 'B',	15,	'K'
union all select 'B',	20,	'A'
union all select 'B',	20,	'G'
union all select 'B',	21,	'L'
union all select 'B',	21,	'M'
union all select 'B',	21,	'N';

select * from @t;

SELECT Artikul, name, dense_rank() over (order by identifier) as Rang
FROM
(
select top 1 with ties * from @t
order by row_number() over (partition by Artikul, name order by identifier)
) as a


Добавил еще одни изделия 12 и 16 с другими вставкам. Это запрос не сработал
13 ноя 14, 12:29    [16839429]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Konst_One, Knyazev Alexey, Вставки могут между собой меняться. И это сочетание идет как другой вариант
13 ноя 14, 12:31    [16839444]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
minya13_85, получается была таблица такая:

Artikulidentifiername
A1X
A2X
A3X
A4B
A5C
B8T
B8K
B9T
B9K
B12T
B12P
B16T
B16R
B15T
B15K
B20A
B20G
B21L
B21M
B21N


Нужно получить такую:
ArtikulnameRang
AX1
AB2
AC3
BT4
BK4
BT5
BP5
BT6
BR6
BA7
BG7
BL8
BM8
BN8
13 ноя 14, 12:45    [16839563]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
minya13_85
BT4
BK4
BT5


это как это?
13 ноя 14, 12:55    [16839625]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Konst_One,

ну смотри в Артикуле В, допустим в изделии 9 есть вставки Т и К, а в изделии 12 есть вставки Т и Р, это два разных изделия. Поэтому в артикуле В, эти два изделия будут выделены в разные группы. одна группа в нашем случае 4, с Т и К, и группа 5 с Т и Р
13 ноя 14, 13:00    [16839659]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
тогда сами дальше, логика у вас непонятная
13 ноя 14, 13:01    [16839675]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Glory
Member

Откуда:
Сообщений: 104760
minya13_85
ну смотри в Артикуле В, допустим в изделии 9 есть вставки Т и К, а в изделии 12 есть вставки Т и Р, это два разных изделия. Поэтому в артикуле В, эти два изделия будут выделены в разные группы. одна группа в нашем случае 4, с Т и К, и группа 5 с Т и Р

Т.е. задача - выбрать уникальные по составу изделия и просто пронумеровать их ?
13 ноя 14, 13:16    [16839762]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Konst_One, Объясню на тетрадях. Допустим есть 2 типа тетрадей: в клетку, в линию. И обложки разных цветов.
Тетради в клетку - это Артикул А, тетрадь в линию - это Артикул В. Но этих тетрадей в клетку и в линию в нашем случае 20 штук различных цветов. У них у всех разные штрихкода. Допустим в клетку синего цвета 3 штуки, красного цвета 1 штука, зеленого цвета- 1, а тетради в линию В , разноцветные обложки. Есть полу синие ,полу красные их 3 штуки, есть полу синие полу зеленые их например 1 штука, полу синие полу черные их также 1 штука и полу желтые и полу голубые также 1 штука. И есть также трехцветные. их тоже 1 штука. И т.д.
Мне нужно вывести все эти тетради, но только по уникальным расцветкам.
13 ноя 14, 13:42    [16839934]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Glory
Member

Откуда:
Сообщений: 104760
minya13_85
Мне нужно вывести все эти тетради, но только по уникальным расцветкам.

Осталось узнать причем тут ранжирование
13 ноя 14, 13:43    [16839936]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Glory,
да , задача такая. уникальные по составу и пронумеровать. так чтобы я понимал что этот состав из одного изделия.
13 ноя 14, 13:45    [16839961]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Glory, Это первое что пришло мне в голову. Может конеш тему не так назвал. Я думал это делается каким-то функциями ранжирования. Если нет, то как?
13 ноя 14, 13:46    [16839972]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Glory
Member

Откуда:
Сообщений: 104760
minya13_85
Я думал это делается каким-то функциями ранжирования.

Сравнение записей/таблиц на совпадение/различие не делается функциями ранжирования
13 ноя 14, 13:48    [16839990]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
minya13_85
Если нет, то как?

declare @t table (Artikul varchar(1),identifier int, name varchar(1))

insert into @t (Artikul, identifier, name)
select 'A',	1,	'X'
union all select 'A',	2,	'X'
union all select 'A',	3,	'X'
union all select 'A',	4,	'B'
union all select 'A',	5,	'C'
union all select 'B',	8,	'T'
union all select 'B',	8,	'K'
union all select 'B',	9,	'T'
union all select 'B',	9,	'K'
union all select 'B',	12,	'T'
union all select 'B',	12,	'P'
union all select 'B',	16,	'T'
union all select 'B',	16,	'R'
union all select 'B',	15,	'T'
union all select 'B',	15,	'K'
union all select 'B',	20,	'A'
union all select 'B',	20,	'G'
union all select 'B',	21,	'L'
union all select 'B',	21,	'M'
union all select 'B',	21,	'N';

with cte
as
(
select Artikul, identifier
, ( select name + '' from @t where Artikul = t.Artikul and identifier = t.identifier order by name for xml path('') ) name 
from @t t
group by Artikul, identifier
)
select Artikul, name, dense_rank() over (order by identifier) as Rang
from
(
select top 1 with ties * from cte
order by row_number() over (partition by Artikul, name order by identifier)
) t
13 ноя 14, 13:51    [16840011]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Knyazev Alexey,
Большое спасибо , но так мне не надо. С помощью конкатенации я знаю как делать. Мне нужны данные именно в таком виде

ArtikulnameRang
AX1
AB2
AC3
BT4
BK4
BT5
BP5
BT6
BR6
BA7
BG7
BL8
BM8
BN8
[/quot]

Т.к. данные в таком виде заливаются в одну программу, где происходит транспонирование уже.
13 ноя 14, 13:56    [16840058]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
minya13_85
Knyazev Alexey,
Большое спасибо , но так мне не надо. С помощью конкатенации я знаю как делать. Мне нужны данные именно в таком виде


вы вообще запросы писать умеете? в чём проблема распарсить строку?

with cte
as
(
  select Artikul, identifier
  , ( select name + '' from @t 
        where Artikul = t.Artikul 
          and identifier = t.identifier 
        order by name for xml path('') 
    ) name 
  from @t t
  group by Artikul, identifier
)
select Artikul
     , substring( t.name, number, 1 ) as name
     , dense_rank() over (order by identifier) as Rang
  from
    ( select top 1 with ties * from cte
        order by row_number() over (partition by Artikul, name order by identifier)
    ) t inner join master..spt_values v
  on v.type = 'P' 
 and number between 1 and len(t.name)
13 ноя 14, 13:58    [16840075]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
Glory
Member

Откуда:
Сообщений: 104760
minya13_85
Мне нужны данные именно в таком виде

А дописать еще один join рука не поднимается ?
13 ноя 14, 13:59    [16840087]     Ответить | Цитировать Сообщить модератору
 Re: Ранжирование  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Knyazev Alexey, мы условились что в поле name будет 1 символ. а как парсить, если поле name будет содержать другое кол-во символов, например:
declare @t table (Artikul varchar(50),identifier int, name varchar(50))

insert into @t (Artikul, identifier, name)
select 'A',	1,	'X'
union all select 'A',	2,	'X'
union all select 'A',	3,	'X'
union all select 'A',	4,	'B'
union all select 'A',	5,	'C'
union all select 'B',	8,	'T'
union all select 'B',	8,	'K'
union all select 'B',	9,	'T'
union all select 'B',	9,	'K'
union all select 'B',	12,	'T'
union all select 'B',	12,	'PQLTR'
union all select 'B',	16,	'T'
union all select 'B',	16,	'RQWER'
union all select 'B',	15,	'T'
union all select 'B',	15,	'K'
union all select 'B',	20,	'A'
union all select 'B',	20,	'G'
union all select 'B',	21,	'L'
union all select 'B',	21,	'MKLN'
union all select 'B',	21,	'N';

with cte
as
(
  select Artikul, identifier
  , ( select name + '' from @t 
        where Artikul = t.Artikul 
          and identifier = t.identifier 
        order by name for xml path('') 
    ) name 
  from @t t
  group by Artikul, identifier
)
select Artikul
     , substring( t.name, number, len(name)) as name
     , dense_rank() over (order by identifier) as Rang
  from
    ( select top 1 with ties * from cte
        order by row_number() over (partition by Artikul, name order by identifier)
    ) t inner join master..spt_values v
  on v.type = 'P' 
 and number between 1 and len(t.name)
13 ноя 14, 14:44    [16840480]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить