我有一个184k记录表,并且通过键concat(tradedate,stock_short)
有一些重复项。我的方法是:
Delete from levermannwithoutdub where recnum not in
(Select max(recnum) from leverman groub by concat(tradedate,stock_short));
表levermanwithoutdub
和leverman
的开头都是相同的。
但是该操作现在需要15000秒,并且仍在工作。
有没有一种更快的方法来删除应保留重复项的max(recnum)的重复项?
我试图理解下面的尝试:
但是我仍然有大约2500个重复项,最多有38条相同记录。
如何在所有2528个重复项上运行它?
Faszit: 我已经完成以下工作: 创建一个空的相同表,其索引唯一于(tradedate,stock_short)。 导出具有recnum降序的旧表。 通过Workbench导入它并忽略错误。
只花了5分钟左右。 我知道这不是复杂的方法,但是比 删除一组SETUM。
此外:我发现:Tutorial 从我这样做的地方:
DELETE t1 FROM levermann t1
INNER JOIN
lev_mitdup_Lnotnull t2
WHERE
t1.recnum < t2.recnum AND concat(t1.tradedate,t1.stock_short) =
concat(t2.tradedate,t2.stock_short);
答案 0 :(得分:2)
确保您在表杠杆手列上有索引(tradedate,stock_short) 避免使用concat来确定where和group by,并使用子查询来减少仅在重复行上的搜索
Delete twd
from levermannwithoutdub twd
inner join (
SELECT max(recnum) max_recnum
FROM leverman l
INNER JOIN (
SELECT tradedate,stock_short
FROM leverman
GROUP BY tradedate,stock_short
HAVING COUNT(*) > 1
) t ON t.tradedate = l.tradedate
AND t.stock_short = l.stock_short
) r on r.max_recnum = twd.recnum
如果您不仅具有重复的值而且具有三倍的值,那么您需要再次运行删除查询
您可以检查
的价值 SELECT tradedate,stock_short, count(*) dup
FROM leverman
GROUP BY tradedate,stock_short
HAVING COUNT(*) > 1
ORDER BY dup desc
在每个交易日,您有很多重复的事实,stock_short 您还可以尝试删除所有与交易日期,stock_short匹配且为<>那是max_recnum
的行。Delete twd
from levermannwithoutdub twd
inner join (
SELECT max(l.recnum) max_recnum, t.tradedate, t.stock_short
FROM leverman l
INNER JOIN (
SELECT tradedate,stock_short
FROM leverman
GROUP BY tradedate,stock_short
HAVING COUNT(*) > 1
) t ON t.tradedate = l.tradedate
AND t.stock_short = l.stock_short
) r on r.max_recnum <> twd.recnum
AND r.tradedate = twd.tradedate
AND r.stock_short = twd .stock_short