Ваше объяснение все еще немного расплывчато.Я думаю, что это будет работать:
Используя этот пример данных:
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