Postgresql-поиск повторяющихся строк подробнее

#postgresql #duplicates

#postgresql #дубликаты

Вопрос:

Следующий запрос возвращает мне несколько строк :

 SELECT   COUNT(*) AS Dup, virtual_switch_id, slot_number, port_number
FROM     switch_port
GROUP BY virtual_switch_id, slot_number, port_number
HAVING   COUNT(*) > 1

dup virtual_switch_id   slot_number port_number
2   47                  0           5
2   46                  0           5
2   26                  1           22
2   46                  0           2
 

Это именно то, чего я сначала хотел, но мне нужна дополнительная информация.
Возможно ли иметь другие значения (которые не являются частью дубликатов)?

Каждая повторяющаяся строка (с проверенными 3 полями) имеет уникальный идентификатор (первичный ключ) в таблице switch_port (и других интересных полях), а каждый virtual_switch_id имеет имя в другой таблице, называемой switch_conf .

Поэтому я хочу получить некоторые подобные результаты (только там, где мои первые три поля дублируются). :

 virtual_switch_id   slot_number port_number id  value1 switch_conf.name
47                  0           5           0   val1   sw1 
47                  0           5           1   val2   sw1
26                  1           22          2   val1   sw2
26                  1           22          8   val4   sw2
26                  1           22          12  val1   sw2         
 

Для того, чтобы выбрать, какие записи дубликатов я должен удалить.

Попробовал какое-то «соединение» безрезультатно (декартово произведение вместо …). Я думаю, что ГРУППИРОВАТЬ ПО-разному — неправильное решение…

Любые подсказки / ответы приветствуются.

Комментарии:

1. Правильно ли я понимаю: вы просто хотите удалить дублирующиеся записи?

2. Я хочу сохранить только запись, вручную удаляя дубликаты, найденные при наличии некоторых значений…

3. Пожалуйста, добавьте некоторые примеры данных к вашему вопросу и более подробно объясните ожидаемый результат. В этом случае я не понял, хотите ли вы получить

4. Я хочу получить результат, подобный второму, указанному в первоначальном вопросе. С помощью этого вывода я могу выбрать, какой «идентификатор» я должен удалить (например: «1» повторяющейся строки 47,0,5, потому что значение поля «value1» неверно для меня).

5. Я просто хочу иметь выходные данные при наличии дубликатов строк с одинаковыми значениями первых 3 полей. В противном случае у меня есть тысячи результатов (несовместимых с человеческим мозгом!)

Ответ №1:

Вы можете использовать COUNT() функцию window, которая добавляет столбец с количеством строк к каждому элементу группы (= раздела). После этого вы можете выбрать все записи с количеством строк> = 2:

     SELECT
        *
    FROM (
        SELECT
            *,
            COUNT(*) OVER (PARTITION BY virtual_switch_id, slot_number, port_number)
        FROM switch_port
    ) s
    WHERE count >= 2
 

Комментарии:

1. Нет, мне нужна дополнительная информация, чтобы выбрать, какую строку я удаляю (необходимо провести расследование перед удалением вручную).

2. Работает не так, как ожидалось: выводите только одну строку среди дубликатов, я хочу иметь обе, чтобы выбрать, какой из них следует удалить.

3. Изменен row_number на count . Теперь должны отображаться все группы с дубликатами.

4. просто добавлены некоторые поля и таблицы для сбора дополнительной информации (с завершением предложения WHERE для объединения)