Найти идентичные объединенные записи в таблице - PullRequest
0 голосов
/ 09 июля 2019

У меня есть таблица с электронной почтой, gruppe как поля, основанные на этой информации. Я хотел бы найти всех пользователей с одинаковым членством (с той же группой), чтобы я мог сгруппировать их по позициям в таблице позиций.gruppe - это уникальное имя группы активных каталогов.

CREATE TABLE [dbo].[tblsource] (
    [Id]     INT           IDENTITY (1, 1) NOT NULL,
    [email]  VARCHAR (150) NULL,
    [gruppe] VARCHAR (150) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[tblpositions] (
    [Id]          INT           IDENTITY (1, 1) NOT NULL,
    [email]       VARCHAR (150) NULL,
    [position] VARCHAR (150) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

На самом деле я хотел бы написать хеш или что-то подобное в положение (оно должно быть идентичным, если все группы идентичны).Это позволило бы мне легко идентифицировать всех людей, которые имеют одинаковую группу.Любая идея приветствуется (также разные подходы), учитывая тот факт, что мне нужно загрузить данные из электронной таблицы.

tblsource (пример данных):

user1@company.com,security-group1  
user1@company.com,security-group89  
user84@company.com,security-group89  
user3@company.com,security-group986  
user84@company.com,security-group1 

, поэтому user1 и user84 имеют одинаковое членствои разделить поэтому позицию

1 Ответ

0 голосов
/ 09 июля 2019

Для поиска идентичных пользователей с одинаковым членством, вы можете попробовать следующий код:

;WITH cte_membership(email,membership)
AS
(
    SELECT  u.email,
        STUFF(
            (
                SELECT N','+m.[group]                   
                FROM dbo.tblsource m
                WHERE m.email=u.email
                ORDER BY m.[group]
                FOR XML PATH(''),TYPE).value('.','nvarchar(max)')
        ,1,1,'') AS membership
    FROM dbo.tblsource u
    GROUP BY u.[email]
),
cte_m(membership)
AS
(
    SELECT m.membership
    FROM cte_membership m
    GROUP BY m.membership
    HAVING COUNT(*)>1
)
SELECT a.membership, b.email
FROM cte_m a
INNER JOIN cte_membership b
ON a.membership=b.membership;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...