Идеальный и самый элегантный способ работы с дублирующимися записями в базе данных SQL - PullRequest
0 голосов
/ 29 мая 2018

Хорошо, вот такая ситуация:

Допустим, у меня есть таблица с именем "File_info", которая содержит список всех файлов с соответствующими им label_set

TABLE: FILE_INFO

FILENAME                                      LABEL_NUMBER
----------------------------------------------------------------------
C:/Test_Software/6.avi                          11
C:/Test_Software/6.avi                          10
C:/Test_Software/6.avi                          8
C:/Test_Software/6.avi                          6
C:/26.avi                                       10
C:/26.avi                                       8
C:/Test_Software/Debug/Current_Frame2.avi       11
C:/Test_Software/Debug/Current_Frame2.avi       10
C:/Test_Software/Debug/Current_Frame1.avi       11
C:/Test_Software/Debug/Current_Frame1.avi       10
C:/Test_Software/26.avi                         11
C:/Test_Software/26.avi                         10
C:/Test_Software/26.avi                         9
C:/Test_Software/26.avi                         8
C:/Test_Software/26.avi                         6

Моя цель заключается в достижении этой структуры в таблице SQLITE:

FILENAME                                       LABEL_NUMBER
----------------------------------------------------------------------
C:/Test_Software/6.avi                          11,10,8,6
C:/26.avi                                       10,8
C:/Test_Software/Debug/Current_Frame2.avi       11,10
C:/Test_Software/Debug/Current_Frame1.avi       11,10
C:/Test_Software/26.avi                         11,10,9,8,6

т.е. один файл должен храниться только один раз !!!

Итак, вот шаги, которые я выполнил, чтобы по крайней мере получить желаемый результат:

1) Найдите все файлы с дублирующими метками, используя SQL-запрос:

SELECT LABEL_NUMBER, FILENAME 
FROM FILE_INFO WHERE 
FILENAME 
in (SELECT FILENAME 
FROM FILE_INFO_SEARCH GROUP BY 
FILENAME HAVING COUNT(*)>1)

2) Создайте два списка (a для file_list, b для label_list)

for file in find_duplicate_files: #Duplicate_Files contains the output of above SQL Query

    process_file.append(file[1])
    process_label.append(file[0])

3) Создайте дикт, используя панд, который будет иметь формат:

df = pd.DataFrame({'A' : process_file, 'B' : process_label})
new_dict = df.groupby('A').B.agg(','.join).to_dict()

Покамой вывод выглядит следующим образом:

C:/Test_Software/6.avi 11,10,8,6
C:/26.avi 10,8
C:/Test_Software/Debug/Current_Frame2.avi 11,10
C:/Test_Software/Debug/Current_Frame1.avi 11,10
C:/Test_Software/26.avi 11,10,9,8,6

Но теперь я остался с последней частью задачи:

4) Внесите изменения в базу данных:

У меня есть две мысли здесь:

Метод: 1

a) Удалить все повторяющиеся записи в таблице

b) Вставьте все ключ и значения dict в столбец Filename и Label_number

Метод: 2

a) Просто запустите запрос для каждого значения ключа моего dict (котороесодержит имя файла) в моей базе данных, и, если найден, обновите столбец меток значением

b) Удалите дублирующиеся записи из таблицы

Я знаю, что будет третий самый элегантный способ сделатьэто, и я ищу то же самое :-)

Помните: у меня есть миллион этих записей для обработки !!Оба метода пока работают, но не эффективны, так как мне нужно выполнить несколько таких запросов.Я ищу короткие ответы, которые бывают быстрыми

Надеюсь, что предоставленная мною информация поможет другим и там !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...