Стереть дубликаты, используя подстроки TSQL - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующая таблица

create table bufScan
(
   msgid int,
   conversationid nvarchar(max),
   mailbox nvarchar(max)
);

INSERT dbo.bufScan VALUES 
(1,'person1@company.com','AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMgAQAPX8hFCq30h3robsMxenwt8='),
(2,'person1@company.com','AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMgAQAESPK731aUirpd0CyOIlR5I='),
(3,'person1@company.com','AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMgAQAESPK731aUirpd0CyOIlR5I='),
(4,'person1@company.com','AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMgAQAPX8hFCq30h3robsMxenwt8='),
(5,'person2@company.com','AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQAQAPX8hFCq30h3robsMxenwt8='),
(6,'person2@company.com','AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQAQAESPK731aUirpd0CyOIlR5I='),
(7,'person2@company.com','AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQAQAESPK731aUirpd0CyOIlR5I='),
(8,'person2@company.com','AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQAQAX8hFCq30h3robsMxenwt8=');

Предположим, что AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQ и AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMg - это записи, которые дают нам информацию для определенного почтового ящика и AX8hFCq30h3robsMxenwt8= и AESPK731aUirpd0CyOIlR5I= для конкретного разговора..

В этом примере person1 общается с person2.Я хотел бы сохранить весь разговор только из одного почтового ящика, иначе это будет похоже на двойной разговор в моих данных.Это означает, что я хотел бы сохранить записи для AX8hFCq30h3robsMxenwt8= и AESPK731aUirpd0CyOIlR5I= из AAQkADhlYTk5MGY1LTJkOTUtNDVjNy1iNDg0LTljYjc5ODAzZTM3OQ или AAQkAGIwZjk4OTk4LTRkZGYtNDM5Yi04NGZlLTAzMDY1MjQ3ZjVlMg.Я надеюсь, что я сделал это более конкретным.Поскольку я хочу также хранить информацию обо всех сообщениях, являющихся частью разговора, я не хочу удалять дубликаты, которые имеют разные идентификаторы сообщений, в одном и том же разделе почтового ящика.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Ваше объяснение все еще немного расплывчато.Я думаю, что это будет работать:

Используя этот пример данных:

USE tempdb
GO

create table dbo.bufScan
(
 msgid int,
 conversationid nvarchar(max),
 mailbox nvarchar(max)
 );

INSERT dbo.bufScan VALUES 
(1,'mailbox1','xxxAQA111'),
(2,'mailbox1','xxxAQA111'),
(3,'mailbox1','xxxAQA222'),
(4,'mailbox1','xxxAQA222'),
(5,'mailbox2','yyyAQA111'),
(6,'mailbox2','yyyAQA111'),
(7,'mailbox2','yyyAQA222'),
(8,'mailbox2','yyyAQA222');

Вы можете сделать это:

WITH uniquify AS
(
  SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY f.conv ORDER BY (SELECT NULL))
  FROM dbo.bufScan
  CROSS APPLY 
    (VALUES (SUBSTRING(mailbox, PATINDEX('%[0-9]%', mailbox), LEN(mailbox)))) f(conv)
)
SELECT msgid, conversationid, mailbox
FROM uniquify
WHERE rn <= 2;

Что возвращает:

msgid       conversationid   mailbox
----------- ---------------- -----------
1           mailbox1         xxxAQA111
2           mailbox1         xxxAQA111
7           mailbox2         yyyAQA222
8           mailbox2         yyyAQA222

Вы можете изменить rn <= 2 на rn = 1, чтобы вернуть это: </p>

msgid       conversationid   mailbox
----------- ---------------- -----------
1           mailbox1         xxxAQA111
7           mailbox2         yyyAQA222
0 голосов
/ 04 июня 2018

Вы можете использовать dense_rank() функцию:

select top (1) with ties *
from table t
order by dense_rank() over (partition by substring(mailbox, 4, len(mailbox)) 
                                          order by conversationid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...