我有一个数据库,其中包含一些错误的结果,这些结果本质上是重复的,但在技术上并不重复。结构是这样的:
id_page (PK), id_site, label, create_date
每个标签的每个站点应该只有一个条目,但事实证明我有一些重复的site
和label
,其中id_page
和create_date
是不同的。我想删除最低的行create_date
。
我想我已经想出了一个解决方案,但我会很感激反馈。
WITH duplicates as (
SELECT id_page, id_site, count(id_site) over (partition by id_site) as ct,
min("create_date") over (partition by id_site) as dt
from pages
where label = '2018-12-15'
)
DELETE from pages
where id_page in (
select p.id_page
from duplicates as d
join pages as p on (p.id_page = d.id_page
and p.create_date = d.dt)
WHERE ct = 2
);
对于给定的信息,假设所有列
NOT NULL
:逻辑,用简单的英语:
删除具有给定
label
的行,其中具有相同但后来label
存在的行。id_site
create_date
这使该行保留每组对等点的最新日期(删除 0-n 个重复项)。
如果可以有相同的重复项
create_date
:...从关系上
create_date
保持与更大的行id_page
。注意行值比较!看,解释:
由于
id_page
是 PK(正如评论中所揭示的),这是明确的。如果有疑问,第二个查询是安全的选择,只是稍微慢一点。为了加快速度,索引将
(label, id_site)
是完美的——按此顺序使用索引表达式。(可能不需要为一次性操作创建它。)快速无索引
与 McNets 查询类似,但
create_date
像上面的第二个查询一样打破了可能的关系。