scripts/database/remove_duplicated_tasks.sql (27 lines of code) (raw):
with
t1 AS (select project_id, x, y, zoom, ARRAY_AGG(CONCAT(id,';', task_status)) AS ids from tasks group by project_id, x, y, zoom),
t2 AS (select project_id, x, y, ids, zoom, array_length(ids, 1) AS cnt from t1 where array_length(ids, 1) > 1 AND x is not null
order by cnt desc),
t3 AS (select project_id, x, y, zoom, unnest(ids) as task_id from t2),
t4 AS (select project_id, x, y, zoom, split_part(task_id, ';', 1) AS task_id, split_part(task_id, ';', 2) AS task_status from t3),
t5 AS (select *,
CASE task_status
WHEN '0' THEN 1
WHEN '1' THEN 2
WHEN '3' THEN 2
WHEN '2' THEN 3
WHEN '6' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 4
ELSE -1 END AS PRIORITY
from t4),
t6 AS (Select DISTINCT ON (t5.project_id, t5.x, t5.y, t5.zoom) t5.project_id, t5.x, t5.y, t5.zoom, t5.task_id, t5.priority
from t5 ORDER BY t5.project_id, t5.x, t5.y, t5.zoom, t5.priority desc)
Select t5.task_id::int AS id, t5.project_id, t5.x, t5.y, t5.zoom INTO temp_table
from t5, t6 where t5.project_id=t6.project_id AND t5.x=t6.x AND t5.y=t6.y AND t5.zoom=t6.zoom AND t5.task_id!=t6.task_id;
DELETE FROM task_invalidation_history AS th USING temp_table AS tt where th.project_id=tt.project_id AND th.task_id=tt.id;
DELETE FROM task_history AS th USING temp_table AS tt where th.project_id=tt.project_id AND th.task_id=tt.id;
DELETE FROM task_annotations AS ta USING temp_table AS tt where ta.project_id=tt.project_id AND ta.task_id=tt.id;
DELETE FROM messages AS ms USING temp_table AS tt where ms.project_id=tt.project_id AND ms.task_id=tt.id;
DELETE FROM tasks AS ts USING temp_table AS tt where ts.x=tt.x AND ts.y=tt.y AND ts.project_id=tt.project_id AND ts.id=tt.id;
DROP TABLE temp_table;