Выберите подмножество повторяющихся записей в SQL Server

Вы должны убедиться, что ваш класс DeliveryNote реализует метод equals (и как результат hashcode). Если это не так, то есть хороший шанс deliveryNotes.remove(note); ничего не сделает.

Если вы уже делаете это (я не могу сказать из вопроса) и используя work отношение в equals, а затем установите поле Work на null, прежде чем вызывать remove, изменяет состояние объекта и вызывает equals для возврата false. Просто установите связь с null после удаления из коллекции.

1
задан enigma6205 18 January 2019 в 22:01
поделиться

1 ответ

Вы можете использовать ROW_NUMBER:

WITH cte AS (
 SELECT *,ROW_NUMBER() OVER(PARTITION BY LName,Fname,DateOfBirth,StreetAddress 
                            ORDER BY ID DESC) rn
 FROM #Dataset
)
SELECT *
FROM cte 
WHERE rn > 1
ORDER BY ID;

db <> демо fiddle

РЕДАКТИРОВАТЬ:

WITH cte AS (
SELECT *, 
  ROW_NUMBER() OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress 
                    ORDER BY ID DESC) rn,
  SUM(CASE WHEN Source = 'Company XYZ' THEN 1 ELSE 0 END) 
               OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) AS cnt
FROM #Dataset
)
SELECT *
FROM cte 
WHERE rn > 1
  AND cnt > 0
  AND [Source] IS NULL
ORDER BY ID;

db <> fiddle demo2

РЕДАКТИРОВАТЬ 2 :

WITH cte AS (
SELECT *, 
  SUM(CASE WHEN Source IS NULL THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c1,
  SUM(CASE WHEN Source = 'Company XYZ' THEN 1 ELSE 0 END) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) AS c2,
  COUNT(*) OVER(PARTITION BY LName, Fname, DateOfBirth, StreetAddress) c3
FROM #Dataset
)
SELECT *
FROM cte 
WHERE c1 > 0
  AND c2 > 0
  AND c3 > 1
  AND Source IS NULL
ORDER BY ID;

db <> fiddle demo3

0
ответ дан Lukasz Szozda 18 January 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: