sql - 删除重复记录

标签 sql postgresql duplicates subquery sql-delete

我有一个表,我想根据两列(id 和角色)识别重复记录,并使用第三列(单位)来选择记录子集进行分析并在其中进行删除。这是表格和几行示例数据:

id | role | unit
----------------
946| 1001 |   1
946| 1002 |   1
946| 1003 |   1
946| 1001 |   2 
946| 1002 |   2
900| 1001 |   3
900| 1002 |   3
900| 1001 |   3

对单元 1 和 2 的分析应确定要删除 946/1001 和 946/1002 的两行。删除标记为unit 1 或2 的行并不重要。在后续步骤中,我会将标记为unit=2 的所有记录更新为unit=1。

我有一个 select 语句能够识别要删除的行:

SELECT * FROM (SELECT 
        unit, 
        id, 
        role,  
        ROW_NUMBER() OVER (
            PARTITION BY 
                id, 
                role 
            ORDER BY 
                id, 
                role
        ) row_num
     FROM thetable WHERE unit IN (1,2)  ) as x
WHERE row_num > 1;

此查询将给出以下结果:

id | role | unit
----------------
946| 1001 |   2 
946| 1002 |   2

现在我想将其与 DELETE 结合起来删除已识别的记录。我已经非常接近(我相信)这个声明:

DELETE FROM thetable tp1 WHERE EXISTS 

(SELECT 
        unit, 
        id, 
        role,  
        ROW_NUMBER() OVER (
            PARTITION BY 
                id, 
                role 
            ORDER BY 
                id, 
                role
        ) as row_num
     FROM 
        thetable tp2 
        WHERE unit IN (1,2) AND 
        tp1.unit=tp2.unit AND 
        tp1.role=tp2.role AND 
        tp1.id=tp2.id AND row_num >1
)

但是,row_num 不被识别为列。那么我应该如何修改这条语句来删除这两条标识的记录呢?

最佳答案

使用 EXISTS 非常简单:

DELETE FROM thetable t
WHERE t.unit IN (1,2)
AND EXISTS (
  SELECT 1 FROM thetable
  WHERE (id, role) = (t.id, t.role) AND unit < t.unit
)

请参阅demo .
结果:

>  id | role | unit
> --: | ---: | ---:
> 946 | 1001 |    1
> 946 | 1002 |    1
> 946 | 1003 |    1
> 900 | 1001 |    3
> 900 | 1002 |    3
> 900 | 1001 |    3

关于sql - 删除重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65158367/

相关文章:

sql - 聚合多个条件 : convert to a single query

php - 通过事件记录或查询获取拥有最多文章的用户及其数量

postgresql - Postgres : query schedule given day, time_of_day,和时区名称

database - 如何在 postgresql 中创建插入触发器以删除与插入的新记录具有相同列值的记录

r - 如何在R中找到不同大小的列之间的共同元素?

python - 如何优化两个元组列表的组合并删除它们的重复项?

mysql - sql从用户登录日志表中找出统计信息

mysql - SQL OR NOT EXISTS 不起作用

json - PostgreSQL单列表转JSON数组

youtube-api - 返回的最大订阅者(和重复)| YouTube API