#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 для объединения)