SQL Server, идентифицирующий все повторяющиеся строки

#sql-server #duplicates #row

#sql-сервер #дубликаты #строка

Вопрос:

У меня есть эта информация в таблице:

 id  Value   Date        Amount
------------------------------
1   79111   2016-10-10  700.00
2   79111   2016-10-10  800.00
3   79111   2016-10-12  900.00
4   79111   2016-10-10  500.00
5   79111   2016-10-27  100.00
  

Я хотел бы идентифицировать все строки с одинаковыми значениями и информацией о дате, например:

 id  Value   Date        Amount  Alert
----------------------------------------
1   79111   2016-10-10  700.00  duplicate
2   79111   2016-10-10  800.00  duplicate
3   79111   2016-10-12  900.00  NULL
4   79111   2016-10-10  500.00  duplicate
5   79111   2016-10-27  100.00  NULL
  

Я сделал, чтобы идентифицировать повторяющиеся строки строки «X»… но мне также нужно идентифицировать эту строку «X» как дублирующуюся запись. Мой запрос:

 WITH CTE AS
(
SELECT *,RN=ROW_NUMBER() OVER (PARTITION BY Value_my, Date_my ORDER BY id DESC) FROM myTable
)
select *
from CTE A
where A.RN>1 Or A.RN = 1
  

Но у меня есть это:

 id  Value   Date        Amount  Alert
----------------------------------------
1   79111   2016-10-10  700.00  NULL ***How identify this row?***
2   79111   2016-10-10  800.00  duplicate
3   79111   2016-10-12  900.00  NULL
4   79111   2016-10-10  500.00  duplicate
5   79111   2016-10-27  100.00  NULL
  

Есть идеи?

Ответ №1:

Это позволит не только идентифицировать повторяющиеся записи, но и определить, к каким записям они относятся.

 Declare @Yourtable table (ID int,value int,Date date,Amount money) 
Insert into @Yourtable values 
(1,79111,'2016-10-10',700.00),
(2,79111,'2016-10-10',800.00),
(3,79111,'2016-10-12',900.00),
(4,79111,'2016-10-10',500.00),
(5,79111,'2016-10-27',100.00)

Select A.*
      ,Alert = case when B.DuplicateOf is null then Null else 'Alert' end
      ,B.DuplicateOf 
 From  @YourTable A
 Cross Apply (Select DuplicateOf = Stuff((Select Distinct ','   cast(id as varchar(25)) 
                              From @YourTable 
                              Where id<>A.id
                                and value=A.value
                                and date =A.date
                                For XML Path ('')),1,1,'')
              ) B
 --Where Dupes is not null
  

ВОЗВРАТ

 ID  value   Date        Amount  Alert   DuplicateOf
1   79111   2016-10-10  700.00  Alert   2,4
2   79111   2016-10-10  800.00  Alert   1,4
3   79111   2016-10-12  900.00  NULL    NULL
4   79111   2016-10-10  500.00  Alert   1,2
5   79111   2016-10-27  100.00  NULL    NULL
  

Ответ №2:

Благодаря @john-cappelletti я нашел решение, основанное на ответе Джона:

 select  a.*,
        case when b.DuplicateOf is null then 0 else 1 end 'Duplicity'
from    myTable a
outer apply (
    Select top 1 id 'DuplicateOf'
    from myTable
    where id <> a.id
    and Value_my = a.Value_my
    and Date_my = a.Date_my
)b