Sobes.tech
Назад к вопросам
Senior
19

Задание 3: Найти дубликаты задач (по departure_station, arrival_station, departure_date, crawler_id) и предложить план безопасного удаления из таблицы harvester_tasks_queue.

Компании, где спрашивали
firebirds tours

Ответ от нейросети

sobes.tech AI

Для поиска дубликатов в таблице harvester_tasks_queue по полям departure_station, arrival_station, departure_date, crawler_id можно использовать следующий SQL-запрос:

SELECT departure_station, arrival_station, departure_date, crawler_id, COUNT(*) AS cnt
FROM harvester_tasks_queue
GROUP BY departure_station, arrival_station, departure_date, crawler_id
HAVING COUNT(*) > 1;

Это позволит выявить группы записей, которые повторяются.

План безопасного удаления дубликатов:

  1. Создать резервную копию таблицы или базы данных перед удалением.
  2. Определить критерий, по которому будет сохраняться одна из дубликатных записей (например, минимальный или максимальный id или дата создания).
  3. Использовать CTE или подзапрос для удаления всех дубликатов, кроме одной записи в каждой группе. Например, если есть уникальный идентификатор id:
WITH duplicates AS (
  SELECT id,
         ROW_NUMBER() OVER (PARTITION BY departure_station, arrival_station, departure_date, crawler_id ORDER BY id) AS rn
  FROM harvester_tasks_queue
)
DELETE FROM harvester_tasks_queue
WHERE id IN (
  SELECT id FROM duplicates WHERE rn > 1
);
  1. Проверить результат удаления, убедиться, что остались только уникальные записи.
  2. При необходимости добавить уникальный индекс по этим полям, чтобы предотвратить появление дубликатов в будущем:
ALTER TABLE harvester_tasks_queue
ADD CONSTRAINT unique_task UNIQUE (departure_station, arrival_station, departure_date, crawler_id);

Такой подход обеспечит безопасное удаление дубликатов и сохранит целостность данных.