Удаление дублированных записей из взвешенной реляционной базы данных - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть реляционная база данных SQL, полученная из данных, возвращаемых классификатором изображений Tensorflow. Я считаю, что в таблице изображений и в реляционной таблице имеется огромное количество повторяющихся записей, и я хотел бы удалить их, не допуская разрыва отношений.

Например, эта таблица отношений:

image_id | term_id | weight
1 18 0.95336
2 18 0.49187
2 25 0.35451
3 18 0.84148
3 18 0.84148
3 18 0.84148
4 18 0.84148
5 7 0.25471

Должно стать:

image_id | term_id | weight
1 18 0.95336
2 18 0.49187
2 25 0.35451
3 18 0.84148
5 7 0.25471

И эта таблица изображений:

ID | file_path | file_name
1 /folder/ imageDog.jpg
2 /folder/ imageMouse.jpg
3 /folder/subfolder/ imageCat.jpg
4 /folder/subfolder/ imageCat.jpg
5 /folder/subfolder/ imageSnake.jpg

Должен стать:

ID | file_path | file_name
1 /folder/ imageDog.jpg
2 /folder/ imageMouse.jpg
3 /folder/subfolder/ imageCat.jpg
5 /folder/subfolder/ imageSnake.jpg

Обратите внимание, что это изображение с идентификатором 4 является дубликатом 3, поэтому необходимо удалить изображение И его взаимосвязи. Я думаю, что в некоторых случаях отношения могут отсутствовать для некоторых дублированных изображений, и в этом случае следует сохранять только одно изображение с отношениями. Я надеюсь, что это имеет смысл.

1 Ответ

0 голосов
/ 05 ноября 2018

Вы можете использовать функцию агрегирования для получения одного image_id, например: min (image_id) группа по term_id, вес

  select min(image_id ) min_id
    , term_id 
    , weight
  from my_table  
  group by term_id, weight

и если вы хотите удалить путь, не связанный с результатом min_id, вы можете использовать

delete  from your_file_path_table 
where ID  not in (
  select min(image_id ) 
     from my_table  
    group by term_id, weight
)
...