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

Откуда: Latvija
Сообщений: 145
В таблицу вводится новое поле - для получения более уникальных запросов из БД.
Было : поле_1, поле_2, поле_3
добавили поле_4. По умолчанию ему присвоено значение 1.

Пример данных :

Было:
1 1 1
1 1 1
2 1 1
2 1 1
Добавили:
1 1 1 1
1 1 1 1
2 1 1 1
2 1 1 1

необходимо пронумеровать с помощью нового поля одинаковые наборы данных, т.е :

1 1 1 1
1 1 1 2
2 1 1 1
2 1 1 2

По запросу :

select
  t.*
from таблица t
join
    (
   select
      поле_1, поле_2, поле_3
   from таблица
   group by поле_1, поле_2, поле_3
   having count(*) > 1
    ) t1 on t.поле_1 = t1.поле_1 and t.поле_2 = t1.поле_2 and t.поле_3 = t1.поле_3


я могу найти одинаковые записи для последующей работы с курсором.

Но может быть есть какой-то более умный способ?

И если нет, то как тогда наиболее умно и рационально для всех записей где, например, поле_1 = 1, поле_2 = 1 и поле_3 = 1 заполнить по порядку поле поле_4, с учетом, что изначально оно для всех записей = 1 ?
12 ноя 12, 18:41    [13460940]     Ответить | Цитировать Сообщить модератору
 Re: Добавление нового поля и его заполнение в виде порядкового номера для одинаковых данных  [new]
Crimean
Member

Откуда:
Сообщений: 13147
declare @a table( n1 int , n2 int , n3 int )

insert into @a select 1 ,1 ,1
union all select 1 ,1 ,1
union all select 2 ,1 ,1
union all select 2 ,1 ,1

select * , row_number() over ( partition by n1, n2, n3 order by n1, n2, n3 )
from @a
12 ноя 12, 18:47    [13460969]     Ответить | Цитировать Сообщить модератору
 Re: Добавление нового поля и его заполнение в виде порядкового номера для одинаковых данных  [new]
Strangers
Member [заблокирован]

Откуда: Україна
Сообщений: 2613
DECLARE @t TABLE (ST1 int, ST2 int, ST3 int)
INSERT INTO @t
SELECT 1,1,1
UNION ALL
SELECT 1,1,1
UNION ALL
SELECT 2,1,1
UNION ALL
SELECT 2,1,1
UNION ALL
SELECT 1,3,1
UNION ALL
SELECT 1,3,1


;WITH asd as
	(SELECT ST1,ST2,ST3, ROW_NUMBER() OVER (ORDER BY ST1,ST2,ST3) as ID FROM @t GROUP BY ST1,ST2,ST3)
SELECT t.*, k.ID
FROM asd k
	JOIN @t t ON k.ST1 = t.ST1 and k.ST2 = t.ST2 and k.ST3 = t.ST3
12 ноя 12, 18:51    [13460986]     Ответить | Цитировать Сообщить модератору
 Re: Добавление нового поля и его заполнение в виде порядкового номера для одинаковых данных  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Спасибо.
Сейчас буду пробовать.
Единственное что смущает - везде SELECT... А мне надо сделать UPDATE для поле_4
12 ноя 12, 19:05    [13461045]     Ответить | Цитировать Сообщить модератору
 Re: Добавление нового поля и его заполнение в виде порядкового номера для одинаковых данных  [new]
Naile
Member

Откуда: Latvija
Сообщений: 145
Чтобы закончить тему полным и правильным решением, хочу выложить свой курсор.
Огромное спасибо Crimean за помощь

declare @a table( n0 int, n1 int , n2 int , n3 datetime )
insert into @a 

			select
			  d.field_0 /*my_table identificator */, d.field_1, d.field_2, d.field_3
			from my_table t
			join
				(
			   select
				  field_1, field_2, field_3			   
			             group by field_1, field_2, field_3
			   having count(*) > 1
				) t1 on t.field_1 = t1.field_1and t.field_2 = t1.field_2 and t.field_3 = t1.field_3 and t1.field_3 > '2012-08-26'



BEGIN 	
	DECLARE name_cursor CURSOR
   		FOR 
			
			select n0 , row_number() over ( partition by n1, n2, n3 order by n1, n2, n3 )
			from @a		


		DECLARE @_id int 
		DECLARE @row_number int
		OPEN name_cursor
		FETCH NEXT FROM name_cursor INTO @_id, @row_number
				
  		WHILE @@FETCH_STATUS = 0
   		BEGIN      				
   				BEGIN
   					UPDATE my_table SET new_field = @row_number where _id = @_id   					
				END
      			FETCH NEXT FROM name_cursor INTO @_id, @row_number
   		END
   		
		
	CLOSE name_cursor
	DEALLOCATE name_cursor

	
END
13 ноя 12, 19:31    [13467671]     Ответить | Цитировать Сообщить модератору
 Re: Добавление нового поля и его заполнение в виде порядкового номера для одинаковых данных  [new]
ужасы нашего городка
Guest
выложено же решение, откуда курсор выплыл???

declare @a table( n1 int , n2 int , n3 int, n4 int )

insert into @a select 1 ,1 ,1, 1
union all select 1 ,1 ,1, 1
union all select 2 ,1 ,1, 1
union all select 2 ,1 ,1, 1;

with cte as
(select n1, n2, n3, n4, row_number() over ( partition by n1, n2, n3 order by n1, n2, n3 ) as n4_new 
from @a)

update c
set n4 = c.n4_new
from cte c 

select *
from @a


n1	n2	n3	n4
1	1	1	1
1	1	1	2
2	1	1	1
2	1	1	2
14 ноя 12, 12:40    [13470921]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить