如何基于字符串从sql server中删除重复项
从SQL表中删除重复项 例如: i/p: 我有上面这样的数据集 输出:如何基于字符串从sql server中删除重复项,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,从SQL表中删除重复项 例如: i/p: 我有上面这样的数据集 输出: EID EName .... ERole 2 Nani SQL Developer 3 Suresh ASP .Net Developer 6 Ravi Sales Force developer 注:以上是一个示例: 在ERole列中,如果前10个字符匹配,则应为重复字符。根据数据集,如果名称严格限定为一个角色,则以下字符将起作用 wit
EID EName .... ERole
2 Nani SQL Developer
3 Suresh ASP .Net Developer
6 Ravi Sales Force developer
注:以上是一个示例:
在ERole列中,如果前10个字符匹配,则应为重复字符。根据数据集,如果名称严格限定为一个角色,则以下字符将起作用
with cte as
(
select *,row_number()over(partition by ename order by ename) rn
from table_name
) delete from cte where rn>1
对于您的数据,您可以使用:
select t.*
from t
where not exists (select 1
from t t2
where t2.ename = t.ename and
t.erole like t2.erole + '%' and
t.eid < t2.eid
);
这不包括前十个字符的限制。但我怀疑它真的能满足你的需求
在ERole列中,如果前10个字符匹配,则应为重复字符
首先,我将设置您的示例,以便您可以测试它
CREATE TABLE #example
(
EID INT PRIMARY KEY IDENTITY,
EName VARCHAR(100),
ERole VARCHAR(MAX)
)
INSERT INTO
#example
VALUES
('Nani','SQL'),
('Nani','SQL Developer'),
('Suresh','ASP .Net Developer'),
('Suresh','ASP .Net'),
('Ravi','Sales Force'),
('Ravi','Sales Force developer')
现在,如果您想根据您的标准删除重复的记录,请使用相同的Ename,相同的ERole中的前10个字符,您可以使用:
WITH grouped_example as (
SELECT
ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
EID
FROM #example
)
DELETE FROM grouped_example where preserve <> 1
WITH grouped_example as (
SELECT
ROW_NUMBER() OVER(PARTITION BY Ename, SUBSTRING(ERole,0,10) ORDER BY ERole DESC) as preserve,
*
FROM #example
)
SELECT EID,EName,ERole FROM grouped_example where preserve = 1
*注意:我使用了ORDER BY ERole DESC,这样我们就可以在角色中保留更多信息和更多角色
*注2:您可以更改需要匹配的字符数,在查看数据集后更改子字符串的最后一个值,这应该对您有用
CREATE TABLE test
(
EID int,
ENAME VARCHAR(20),
EROLE VARCHAR(30));
INSERT INTO test
VALUES (1,'NANI','SQL'),
(2,'NANI','SQL DEVELOPER'),
(3,'Suresh','ASP .NET Developer'),
(4,'Suresh', 'ASP .Net'),
(5, 'Ravi', 'Sales Force'),
(6, 'Ravi', 'Sales Force developer');
DELETE FROM test
WHERE EID IN(
SELECT EID FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ENAME ORDER BY LEN(EROLE) DESC) as RN
from #test) tab1 WHERE RN != 1);
SELECT * FROM test
试试这个
with cte as
(
select *,row_number()over(partition by LEFT(EROle, 10) order by left(EROle, 10) rn
from T
) delete from cte where rn=1
在ERole列中,如果前10个字符匹配,则应为重复字符。那么为什么SQL是重复的呢?从表1中选择*,其中上面的“%Developer%”只是一个例子,高级架构师高级架构师PMP 101高级架构师新PMP高级架构师PMP 101高级架构师新PMP,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录——高级建筑师、高级建筑师PMP 101、高级建筑师新PMP,我有这样的角色,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录高级架构师,高级建筑师PMP 101,高级建筑师新PMP我有这样的角色,根据我在这三个角色中的要求,前10个字符是相同的,所以我只需要考虑1个记录。
CREATE TABLE test
(
EID int,
ENAME VARCHAR(20),
EROLE VARCHAR(30));
INSERT INTO test
VALUES (1,'NANI','SQL'),
(2,'NANI','SQL DEVELOPER'),
(3,'Suresh','ASP .NET Developer'),
(4,'Suresh', 'ASP .Net'),
(5, 'Ravi', 'Sales Force'),
(6, 'Ravi', 'Sales Force developer');
DELETE FROM test
WHERE EID IN(
SELECT EID FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ENAME ORDER BY LEN(EROLE) DESC) as RN
from #test) tab1 WHERE RN != 1);
SELECT * FROM test
with cte as
(
select *,row_number()over(partition by LEFT(EROle, 10) order by left(EROle, 10) rn
from T
) delete from cte where rn=1