Поиск дубликата записей в таблице SQL

Есть таблица с несколькими полями. Есть список id, к которым нужно найти дубликаты по 3 полям (поле 1, поле 2, поле 3).

Например, у меня есть id 1 - соответственно запрос должен вернуть id 5 и id 10 (совпадают первые 3 поля);для id 3 вернет id 7 (также совпадают 3 поля), для остальных id ничего не вернет (нет совпадений по 3 полям).

введите сюда описание изображения

Не могу составить запрос, который вывод бы только дубликаты (или исходная строка + дубликат) на основе id, прошу помочь.

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

Естественно, "боевая" таблица в разы больше :) Нужно понять принцип.


Ответы (2 шт):

Автор решения: Aziz Umarov

Используйте оконные функции.

With data as (
  Select
   *,
   row_number() over (partition by [Поле1],[Поле2],[Поле3] order by id) as rowNumber 
  from table 
)
Select
  * 
from data 
where
 rowNumber > 1

Пример с rank фильтровать id

With data as (
  Select
   *,
   row_number() over (partition by [Поле1],[Поле2],[Поле3] order by id) as rowNumber,
  Rank() over (partition by [Поле1],[Поле2],[Поле3] order by id) as rowRank 
  from table 
)
Select
  * 
from data
 Inner join data as data1
    On data.rowRank = data1.rowRank and data.id <> data1.id
where
 Data1.rowNumber > 1 and data.id in (надо указать список id который нужно отфильтровать)
→ Ссылка
Автор решения: IgorSl
select * from table where id not in
(select max(id) id from table group by поле1, поле2, поле3 having count(*)=1)
→ Ссылка