#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