删除同一表SQL中不同类别中的重复值但保留第一个类别值

Posted

技术标签:

【中文标题】删除同一表SQL中不同类别中的重复值但保留第一个类别值【英文标题】:Remove duplicate value in different categories in same table SQL but keep the first category value 【发布时间】:2021-11-03 06:32:18 【问题描述】:

假设我有一个表,其 id 和类别如下表所示

 D_id | D_category
-----------------
   1  |   A
   2  |   A
   3  |   A

   1  |   B
   2  |   B
   4  |   B
   5  |   B

   1  |   C
   2  |   C
   4  |   C
   5  |   C
   6  |   C

所以规则是这样的

A 类的值不应出现在 B 类和 C 类中 B 类中的值不应出现在 C 类中

最终的结果应该是这样的


 D_id | D_category
-----------------
   1  |   A
   2  |   A
   3  |   A

   4  |   B
   5  |   B

   6  |   C

我将提供一个可行的解决方案,但它不是一个理想的解决方案,如果有更多类别,任何人都可以帮助我提供更好的解决方案,这意味着如果有更多类别,那么它应该遵循之前类别中的值应该遵循的规则没有出现在任何其他类别中

DECLARE @A TABLE(
    D_id INT NOT NULL,
    D_category VARCHAR(MAX));

INSERT INTO @A(D_id,D_category)
VALUES (1, 'A'),
(2, 'A'),
(3, 'A'),
(1, 'B'),
(2, 'B'),
(4, 'B'),
(5, 'B'),
(1, 'C'),
(2, 'C'),
(4, 'C'),
(5, 'C'),
(6, 'C')

DELETE t
FROM @A t
WHERE t.D_category = 'B' AND  EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'A' and t.D_id = t2.D_id)

DELETE t
FROM @A t
WHERE t.D_category = 'C' AND  EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'B' and t.D_id = t2.D_id)

DELETE t
FROM @A t
WHERE t.D_category = 'C' AND  EXISTS (SELECT 1 FROM @A t2 WHERE t2.D_category = 'A' and t.D_id = t2.D_id)

select * from @A

【问题讨论】:

为什么之前删除了这个问题,然后在另一个帐户下重新提问?我本来正要回答的。拥有多个帐户违反了条款和条件。 【参考方案1】:

只需检查指定的记录在序列的前面是否不存在。

select *
from @A A1
where not exists (
  select 1
  from @A A2
  where A2.D_id = A1.D_id
  and A2.D_category < A1.D_category
)

【讨论】:

【参考方案2】:

或者只是使用row_number()

select  *
from
(
    select  *, r = row_number() over (partition by D_id order by D_category)
    from    @A 
) a
where   a.r = 1

【讨论】:

【参考方案3】:

使用连接语法删除:

delete a
from my_table a
join my_table b on a.D_id = b.D_id
  and a.D_category > b.D_category

见live demo。

【讨论】:

以上是关于删除同一表SQL中不同类别中的重复值但保留第一个类别值的主要内容,如果未能解决你的问题,请参考以下文章

如何删除R中两列中具有相同值但ID不同的行[重复]

Mysql根据一张表俩个字段删除重复数据

SQL中,如何将三个表中同一字段中的内容汇总到一个字段中?

怎样删除EXCEL表重复数据,保留最新的一个

如何删除sql中某个字段出现重复的数据,且只保留id最小的

删除一张表中重复数据并保留一条ID最小的记录