Если вам нужно только перечислить группы в запросе, то row_number()
будет работать для вас:
declare @Names table (First_Name varchar(10), Middle_Name varchar(10), Last_Name varchar(10))
insert into @Names
select 'Jon', 'Jacob', 'Schmidt' union all
select 'William', 'B.', 'Schmidt' union all
select 'Sally', 'Anne', 'Johnson' union all
select 'Jon', 'Two', 'Schmidt'
;with Groups (First_Name, Last_Name, Group_ID) as
( select First_Name, Last_Name, row_number()over(order by Last_Name)
from @Names
group
by First_Name, Last_Name
)
select n.First_Name, n.Middle_Name, n.Last_Name, g.Group_Id
from @Names n
join Groups g on
n.First_Name = g.First_Name and
n.Last_Name = g.Last_Name;
Имейте в виду значение GROUP_ID изменится по мере появления новых nameGroups.
Если вы хотите назначить и , то сохраняйте group_ID, тогда я предложил бы создать вспомогательную таблицу и назначить там идентификаторы Group_ID.
Сохраняя сопоставление вне таблицы @Names, вы разрешаете пользователям изменять свои имена и не беспокоиться о переоценке назначения группы. Он также позволяет изменять логику группировки без повторного назначения имен. У вас также есть возможность на карте подобные достаточно значений для той же группировки (Джон, Джон, Джонни).
Group_ID состоит из First_Name и Last_Name. Итак, храните его таким образом.
declare @Names table (First_Name varchar(10), Middle_Name varchar(10), Last_Name varchar(10))
insert into @Names
select 'Jon', 'Jacob', 'Schmidt' union all
select 'William', 'B.', 'Schmidt' union all
select 'Sally', 'Anne', 'Johnson' union all
select 'Jon', 'Two', 'Schmidt'
declare @NameGroup table (Group_Id int identity(1,1), First_Name varchar(10), Last_Name varchar(10) unique(First_Name, Last_Name));
insert into @NameGroup (First_Name, Last_Name)
select 'Jon', 'Schmidt' union all
select 'Sally', 'Johnson';
declare @Group_ID int;
declare @First_Name varchar(10),
@Middle_Name varchar(10),
@Last_Name varchar(10)
select @First_Name = 'Jon',
@Middle_Name = 'X',
@Last_Name = 'Schmidt'
--be sure the Id has already been assigned
insert into @NameGroup
select @First_Name, @Last_Name
where not exists(select 1 from @NameGroup where First_Name = @First_Name and Last_Name = @Last_Name)
--resolve the id
select @Group_ID = Group_ID
from @NameGroup
where First_Name = @First_Name and
Last_Name = @Last_Name;
--store the name
insert into @Names (First_Name, Middle_Name, Last_Name)
values(@First_Name, @Middle_Name, @Last_Name);
select n.First_Name, n.Middle_Name, n.Last_Name, ng.Group_Id
from @Names n
join @NameGroup ng on
n.First_Name = ng.First_Name and
n.Last_Name = ng.Last_Name;
Ваш пример показывает, что '' Jon '=' William''. – HABO
И если вы добавите «Джон Джонсон» к данным, какими будут новые группы? –