使用 PostgreSQL 根据特定列和优先级删除数据



我有几列包括:device_id,时间和类型,现在我想删除重复的数据。

这是我的数据示例:

+-----------+------------+------+
| device_id |    time    | type |
+-----------+------------+------+
| dev 1     | 2020/06/17 | A    |
| dev 1     | 2020/06/17 | B    |
| dev 2     | 2020/06/18 | B    |
| dev 2     | 2020/06/18 | B    |
| dev 3     | 2020/06/17 | A    |
| dev 3     | 2020/06/17 | A    |
+-----------+------------+------+

我希望输出遵循规则:

  1. 2020/6/17 中的 dev 1 中有 A 和 B 类型,保留 A
  2. 2020/6/18 的开发 2 中只有 B 类型,保留 B
  3. 2020/6/17 中的 dev 3 中只有 A 类型,保留 A

删除后,我的预期输出是:

device_id |  time      | type
-----------+------------+------
dev 1     | 2020/06/17 | A
dev 2     | 2020/06/18 | B
dev 3     | 2020/06/17 | A

是否有任何删除语句可以完成这项工作?欢迎任何建议!

如果我的问题有任何部分不太清楚,

请让我知道,谢谢。

其他详细信息:

  1. 这个问题与我类似,但我需要删除语句和 postgresql 版本
  2. 我的数据库中大约有 9000 万数据(IOT 数据(,所以如果 SQL 语句效率高,欢迎

在与我的团队负责人讨论并参考章节:使用子查询删除重复行之后

最后我得到我的解决方案如下:

DELETE FROM My_table
WHERE id IN 
(SELECT t.id
FROM
(SELECT id,
ROW_NUMBER() OVER( PARTITION BY device_id,
time
ORDER BY type) AS row_num
FROM My_table) t
WHERE t.row_num > 1);

我认为关键是从重复的行中找到唯一的对象(例如:id(

并将其用作搜索条件。

因为我的数据库中有很多数据,所以我设置了索引键,包括device_id、时间和类型

如果有人有更好的答案,请与我分享,谢谢!

最新更新