database - 有条件地从 postgres 中的数据库中删除重复项
问题描述
我想从“值”列中删除重复项,但前提是上次更新没有更改。我阅读了有关滞后和领先的教程,但找不到删除重复项的示例。
原来的:
+----+-------+-------+------------------------+
| ID | subID | value | updated_at |
+----+-------+-------+------------------------+
| 1 | 2 | 2.20 | 2020-02-16 07:36:25+01 |
| 1 | 2 | 2.20 | 2020-02-16 07:31:25+01 |
| 1 | 2 | 2.20 | 2020-02-16 07:26:25+01 |
| 1 | 2 | 2.30 | 2020-02-16 07:21:25+01 |
| 1 | 2 | 2.20 | 2020-02-16 07:16:25+01 |
| 1 | 2 | 2.20 | 2020-02-16 07:11:25+01 |
+----+-------+-------+------------------------+
期望的输出:
+----+-------+-------+------------------------+
| ID | subID | value | updated_at |
+----+-------+-------+------------------------+
| 1 | 2 | 2.20 | 2020-02-16 07:36:25+01 |
| 1 | 2 | 2.30 | 2020-02-16 07:21:25+01 |
| 1 | 2 | 2.20 | 2020-02-16 07:16:25+01 |
+----+-------+-------+------------------------+
解决方案
我会使用滞后或领先并由 ctid 删除:
DELETE FROM yourtable WHERE ctid IN
(
SELECT
ctid
FROM
(
SELECT
ctid,
value,
LAG(value) OVER(PARTITION BY id, subid ORDER BY updated_at) pre
FROM
yourtable t
) t
WHERE value = pre
)
与来自 Internet 的任何删除查询一样,针对表的副本运行它...
推荐阅读
- amazon-web-services - 是否有我们可以利用的 Amazon AWS 服务来检测两个文本之间的相关性?
- c++ - 究竟如何解释 C++ 中 std::getline(stream, string) 函数填充的字符串
- python - 有没有办法使用 Python 或任何其他编程/脚本语言更改多个文件的扩展名?
- github - 如何在 github 上编辑和删除文件?
- android - 我的 android 应用程序在 android 6.0 及更高版本中无法从 USB 读取图像
- javascript - 如何编译具有严格内存限制的打字稿
- javascript - 困惑 | 当 API 请求失败时 Redux saga 不会抛出任何错误
- python - 得到一个错误,模块 backports.lzma 不存在于它应该存在的文件中,但该模块安装在我的机器中。我该如何解决?
- javascript - 如何从像谷歌浏览器开发工具这样的网站中提取反应 js 代码?
- mysql - 分配为动态字段别名的“用户定义变量”错误