删除重复行如果n个字符匹配

时间:2014-11-26 07:46:16

标签: sql sql-server sql-server-2008

我有运行时间表给我输出像:

NO  COMPANY NAME        CONTACT NO
1   ABC DEF PVT         1234567890
2   ABC DEF PVT.        1234567890
3   XYZ ABC LTD         987654321
4   XYZ ABC LTD PVT.    987654321

此处,NO是主键。

我想只显示第一个&第3排。

我的条件是前5个字符匹配,只考虑重复行并将其删除。即删除第二个&第四。

1 个答案:

答案 0 :(得分:1)

这是关于如何排除重复项的建议

测试数据:

DECLARE @tbl TABLE(NO INT,[COMPANY NAME] VARCHAR(100),[CONTACT NO] VARCHAR(100))
INSERT INTO @tbl
VALUES
(1,'ABC DEF PVT','1234567890'),
(2,'ABC DEF PVT.','1234567890'),
(3,'XYZ ABC LTD','987654321'),
(4,'XYZ ABC LTD PVT.','987654321'),
(5,'ABC DEF PVT','9994567890')

<强>查询:

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY SUBSTRING([COMPANY NAME],1,5),[CONTACT NO] 
                          ORDER BY NO) AS RowNbr,
        tbl.*
    FROM
        @tbl AS tbl
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.RowNbr=1

要完成相同的结果,您也可以在没有公用表表达式的情况下执行此操作。像这样:

SELECT
    *
FROM
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY SUBSTRING([COMPANY NAME],1,5),[CONTACT NO] 
                          ORDER BY NO) AS RowNbr,
        tbl.*
    FROM
        @tbl AS tbl
) AS t
WHERE t.RowNbr=1

<强>结果:

1   1   ABC DEF PVT 1234567890
1   3   XYZ ABC LTD 987654321
1   3   XYZ ABC LTD 987654321

参考: