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

Откуда: ☭
Сообщений: 72991
Microsoft SQL Server 2012 (SP1) - 11.0.3153.0 (X64)

Priority Semester Code Пронумеровать так:
13 1 A 1
14 1 A 1
30 1 B 2
31 2 A 1
35 2 B 2
38 2 B 2
39 2 C 3

Могу пронумеровать не глядя на Code: row_number() over (PARTITION by Semester order by Priority)
А как пронумеровать одинаково одинаковые коды? В голову приходит только пронумеровать select distinct Semester, Code и присоединить, может есть еще варианты?
21 май 15, 18:00    [17673060]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8812
rank()
21 май 15, 18:07    [17673094]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Antonariy
А как пронумеровать одинаково одинаковые коды?


Видимо вам нужен DENSE_RANK
21 май 15, 18:08    [17673097]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8812
dense_rank(), точнее.
21 май 15, 18:08    [17673098]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
o-o
Guest
declare @t table (Priority int,	Semester int,	Code char(1), answ int);
insert into @t values
(13,	1,	'A',	1),
(14,	1,	'A',	1),
(30,	1,	'B',	2),
(31,	2,	'A',	1),
(35,	2,	'B',	2),
(38,	2,	'B',	2),
(39,	2,	'C',	3)

select *, dense_rank() over (order by Code) as rnk
from @t
21 май 15, 18:12    [17673111]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72991
o-o
declare @t table (Type int,	Semester int,	Code char(1), answ int);
insert into @t values
(13,	1,	'A',	1),
(14,	1,	'A',	1),
(30,	1,	'B',	2),
(31,	2,	'A',	1),
(35,	2,	'B',	2),
(38,	2,	'B',	2),
(39,	2,	'C',	3)

select *, dense_rank() over (order by Code) as rnk
from @t
Спасибо, + partition by Semester и получается то что нужно.
Но я забыл еще условие:

declare @t table (Type int,	Semester int,	Code char(1), answ int);
insert into @t values
(0,	1,	'A',	1),
(0,	1,	'A',	1),
(0,	1,	'B',	2),
(0,	2,	'A',	1),
(1,	2,	'B',	2),
(1,	2,	'B',	3),
(0,	2,	'C',	4)
если Type = 1, то у одинаковых кодов должна продолжиться сквозная нумерация.
21 май 15, 18:37    [17673194]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
Добрый Э - Эх
Guest
Antonariy
Но я забыл еще условие: если Type = 1, то у одинаковых кодов должна продолжиться сквозная нумерация.


Как вариант:
--
-- Твои тестовые данные:
declare @t table (Type int,	Semester int,	Code char(1), answ int)
insert into @t values
(0,	1,	'A',	1),
(0,	1,	'A',	1),
(0,	1,	'B',	2),
(0,	2,	'A',	1),
(1,	2,	'B',	2),
(1,	2,	'B',	3),
(0,	2,	'C',	4)
--
-- Мой вариант запроса:
select TYPE, Semester, Code
     , answ -- <-- Требуемый вид нумерации.
     , DENSE_RANK() 
             over(partition by semester 
                      order by code
                             , case type when 1 then rn else 0 end
                 ) as x_answ -- <-- Вычисленный в запросе вид нумерации.
  from (
         select TYPE, Semester, Code, answ
              , ROW_NUMBER() over(order by semester, code) as rn
           from @t
       ) v;
on-line проверка на sqlfiddle.com
22 май 15, 04:49    [17674146]     Ответить | Цитировать Сообщить модератору
 Re: Пронумеровать строки  [new]
Добрый Э - Эх
Guest
Добрый Э - Эх,

З.Ы.

Если в исходной таблице есть уникальное поле, то подзапрос с ROW_NUMBER можно выкинуть. а на верхнем уровне в CASE-е вместо вычисленного в подзапросе значения RN использовать это самое уникальное поле...
22 май 15, 04:55    [17674147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить