我正在尝试在列中查找重复项,其中数据表示同一件事,但在处理过程中未正确规范化。 我建立了一个#表,其中包含两个要搜索的关键字段。 与其修剪或处理该列,我不希望顺序地带回所有匹配的8个以上字符。
示例数据:
ID Information
1 ABCDEF12.domain
2 domain.ABCDEF12
3 XYZABC123.22.26
4 222-XYZABC123-26
5 YYYYYYYYYYYYYYYY
6 AAAAAAAAAAAAAAAA
7 XYZABC123
8 ABCDEF12
9 123456789.1.2
将按最小长度排序返回:
ID Information
8 ABCDEF12
1 ABCDEF12.domain
2 domain.ABCDEF12
7 XYZABC123
3 XYZABC123.22.26
4 222-XYZABC123-26
任何起点,最佳实践或实现这一目标的任何指示都是很好的。我不确定最初如何识别具有8个或更多字符的所有值,以缩小数据集的范围,排序相对简单。
答案 0 :(得分:0)
这是一个解决方案。 这使用Alan Burstein's tally table Number function
DECLARE @T1 TABLE ([ID] int, [Information] Nvarchar(16)) ;
INSERT INTO @T1 (ID ,Information)
VALUES
(1, N'ABCDEF12.domain'),
(2, N'domain.ABCDEF12'),
(3, N'XYZABC123.22.26'),
(4, N'222-XYZABC123-26'),
(5, N'YYYYYYYYYYYYYYYY'),
(6, N'AAAAAAAAAAAAAAAA'),
(7, N'XYZABC123'),
(8, N'ABCDEF12'),
(9, N'123456789.1.2')
;
SELECT DISTINCT
T.ID,T.Information
FROM @T1 T
CROSS APPLY dbo.getNums(1, LEN(T.Information), 1, 1) N
INNER JOIN
@T1 T1 ON ( SUBSTRING(T.Information, N, LEN(T.Information)) LIKE '%' + T1.Information + '%' OR
SUBSTRING(T1.Information, N, LEN(T1.Information)) LIKE '%' + T.Information + '%'
)
AND ( LEN(SUBSTRING(T1.Information, N, LEN(T1.Information))) > 8 OR
LEN(SUBSTRING(T.Information, N, LEN(T.Information))) > 8
)
AND T1.ID <> T.ID
输出
ID Information
4 222-XYZABC123-26
8 ABCDEF12
1 ABCDEF12.domain
2 domain.ABCDEF12
7 XYZABC123
3 XYZABC123.22.26
答案 1 :(得分:0)
用您的表名替换YOUR_TABLE
并尝试以下操作:
SELECT A.Id, TBL.Information, TBL.Id as New_Id
INTO #FINAL
FROM YOUR_TABLE as A
OUTER APPLY
(
SELECT Information, ID FROM YOUR_TABLE as B WHERE Information LIKE (SELECT '%' + Information + '%' FROM YOUR_TABLE as C WHERE C.ID = A.ID)
) TBL
SELECT Information FROM #FINAL WHERE Id In (SELECT Id from #FINAL GROUP BY Id HAVING COUNT(*) > 1)