SQL для поиска повторяющихся записей (внутри группы)
У меня небольшая проблема, и я не уверен, что будет лучшим способом ее исправить, поскольку у меня ограниченный доступ к самой базе данных (Oracle).
В нашей таблице «СОБЫТИЕ» у нас есть около 160 тыс. Записей, у каждого СОБЫТИЯ есть GROUPID, а у обычной записи ровно 5 строк с одинаковым GROUPID. Из-за ошибки в настоящее время мы получаем пару дублированных записей (дубликаты, поэтому 10 строк вместо 5, просто другой EVENTID. Это может измениться, поэтому просто <> 5). Нам нужно отфильтровать все записи этих групп.
Из-за ограниченного доступа к базе данных мы не можем использовать временную таблицу и не можем добавить индекс в столбец GROUPID, чтобы сделать его быстрее.
Мы можем получить GROUPID с этим запросом, но нам понадобится второй запрос, чтобы получить необходимые данные
select A."GROUPID"
from "EVENT" A
group by A."GROUPID"
having count(A."GROUPID") <> 5
Одним из решений будет выбор:
select *
from "EVENT" A
where A."GROUPID" IN (
select B."GROUPID"
from "EVENT" B
group by B."GROUPID"
having count(B."GROUPID") <> 5
)
Без индекса GROUPID и 160 тыс. Записей это занимает слишком много времени.
Пытался подумать о соединении, которое может справиться с этим, но пока не может найти хорошего решения.
Кто-нибудь может найти хорошее решение для этого, может быть?
Небольшое редактирование:
Здесь у нас нет 100% дубликатов, поскольку у каждой записи по-прежнему есть уникальный идентификатор, а GROUPID также не уникален (поэтому нам нужно использовать «группировать по») - или, может быть, я просто упускаю простое решение для этого :)
Небольшой пример с данными (я не хочу их удалять, просто найди их)
EVENTID | GROUPID | TYPEID<br>
123456 123 12<br>
123457 123 145<br>
123458 123 2612<br>
123459 123 41<br>
123460 123 238<br>
<br>
234567 123 12<br>
234568 123 145<br>
234569 123 2612<br>
234570 123 41<br>
234571 123 238<br>
У него есть еще несколько столбцов, таких как отметка времени и т. Д., Но, как вы уже можете видеть, все идентично, кроме EVENTID.
Мы будем запускать его чаще для тестирования, чтобы найти ошибку и проверить, не произойдет ли она снова.