, groupid - , 100.
, .
-, " ". RBAR. , , , RBAR.
, , SET BASE METHOD, .
, RBAR script , , .
, .
Alsi script , id , , , .
print , .
SET NOCOUNT ON
DECLARE @Tbl TABLE(
ID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50),
DateOfBirth DATE,
BirthCountry VARCHAR(50),
GroupID INT NULL
);
INSERT INTO @Tbl VALUES
(1, 'Jonh', 'Doe', '1983-01-01', 'Grand', NULL) ,
(2, 'Jack', 'Stone', '1976-06-08', 'Grand', NULL),
(3, 'Jane', 'Doe', '1982-02-08', 'Grand', NULL),
(4, 'Adam', 'Wayne', '1983-01-01', 'Grand', NULL),
(5, 'Kay', 'Wayne', '1976-06-08', 'Grand', NULL),
(6, 'Matt', 'Knox', '1983-01-01', 'Hay', NULL),
(7, 'Jerry', 'Stone', '1976-06-08', 'Hay', NULL)
DECLARE @StartGroupid INT = 100
DECLARE @id INT
DECLARE @Groupid INT
DECLARE @Maxid INT
DECLARE @i INT = 1
DECLARE @MinGroupID int=@StartGroupid
DECLARE @MaxGroupID int=@StartGroupid
DECLARE @LastGroupID int
SELECT @maxid = max(id)
FROM @tbl
WHILE (@i <= @maxid)
BEGIN
SELECT @id = id
,@Groupid = Groupid
FROM @Tbl a
WHERE id = @i
if(@Groupid is not null and @Groupid<@MinGroupID)
set @MinGroupID=@Groupid
if(@Groupid is not null and @Groupid>@MaxGroupID)
set @MaxGroupID=@Groupid
if(@Groupid is not null)
set @LastGroupID=@Groupid
UPDATE A
SET groupid =case
when @id=1 and b.groupid is null then @StartGroupid
when @id>1 and b.groupid is null then @MaxGroupID+1
when @id>1 and b.groupid is not null then @MinGroupID
end
FROM @Tbl A
INNER JOIN @tbl B ON b.id = @ID
WHERE (
(
a.BirthCountry = b.BirthCountry
and a.DateOfBirth = b.dateofbirth
)
or (a.LastName = b.LastName and a.BirthCountry = b.BirthCountry)
or (a.LastName = b.LastName and a.dateofbirth = b.dateofbirth)
)
SET @i = @i + 1
SET @ID = @I
END
SELECT *
FROM @Tbl
, 56 000 rownum = 1. , , .
;with CTE as
(
select a.ID,a.FirstName,a.LastName,a.DateOfBirth,a.BirthCountry
,@StartGroupid GroupID
,1 rn
FROM @Tbl A where a.id=1
UNION ALL
Select a.ID,a.FirstName,a.LastName,a.DateOfBirth,a.BirthCountry
,case when ((a.BirthCountry = b.BirthCountry and a.DateOfBirth = b.dateofbirth)
or (a.LastName = b.LastName and a.BirthCountry = b.BirthCountry)
or (a.LastName = b.LastName and a.dateofbirth = b.dateofbirth)
) then b.groupid else b.groupid+1 end
, b.rn+1
FROM @tbl A
inner join CTE B on a.id>1
where b.rn<@Maxid
)
,CTE1 as
(select * ,row_number()over(partition by id order by groupid )rownum
from CTE )
select * from cte1
where rownum=1