-- 如何在MS SQL Server 2008中实现此功能?有何建议?
-- 我所指的“重复行”是指“前3个字段匹配” -- 我需要从结果中排除重复项,但我需要决定保留哪一行 -- 保留第4列中有值的行(每组重复的数据对只会有1行)
-- 结果应保留第2行(但不保留第1行) -- 同样保留第3行(但不保留第4行) -- 保留所有其余行(没有重复行) -- 应返回10行中的8行
IF(OBJECT_ID('tempdb..#tmp') IS NOT NULL) DROP TABLE #tmp
CREATE TABLE #tmp
(
aKey Int IDENTITY(1,1) PRIMARY KEY,
f1 VarChar(10) NOT NULL DEFAULT 0, -- 1
f2 VarChar(10) NOT NULL DEFAULT 0, -- 2
f3 VarChar(10) NOT NULL DEFAULT 0, -- 3
f4 VarChar(10) NOT NULL DEFAULT 0,
f5 VarChar(10) NOT NULL DEFAULT 0,
f6 VarChar(10) NOT NULL DEFAULT 0
)
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('A', 'B', 'C', '' , 'del', '1') -- 1st of the duplicate
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('A', 'B', 'C', 'D', 'keep', '1') -- 2nd of the duplicate
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('D', 'E', 'F', 'G', 'keep', '2') -- 1st of the duplicate
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('D', 'E', 'F', '' , 'del', '2') -- 2nd of the duplicate
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('H', 'G', 'N', 'Q', '1', 'K')
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('I', 'G', 'C', '' , '2', 'L')
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('J', 'H', 'D', 'R', '3', 'P')
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('K', 'G', 'C', '' , '4', 'K')
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('L', 'G', 'C', 'S', '5', 'V')
INSERT INTO #tmp(f1, f2, f3, f4, f5, f6) VALUES('K', 'M', 'C', '' , '6', 'K')
--从#tmp表中选择所有数据
-- This "almost" works, but is excluding too many non-duplicate rows:
SELECT DISTINCT t1.* FROM #tmp AS t1
INNER JOIN #tmp AS t2
ON t1.f1 = t2.f1 AND t1.f2 = t2.f2 AND t1.f3 = t2.f3
WHERE t1.f4 <> ''
row_number() over (partition by f1,f2,f3, f4 desc)
并且仅返回第1行。这将为每个“相似”的重复项分配行号,然后仅返回第1行。但是,考虑到您的条件只返回具有 f4 值的记录......在确定要使用哪条记录方面存在太多不确定性。 - xQbert