Я хочу найти подозрительные транзакции, которые имеют 3 или более последовательных транзакций в течение 10 минут.
образец данных
ожидаемый результат
мой приведенный ниже код работает не очень хорошо.Потому что это дает мне идентификатор 116 и 117, что не так
IF OBJECT_ID('tempdb..#t') is not null DROP TABLE #t;
create TABLE #t
(
trans_id int, trans_time datetime, store_address varchar(20)
)
insert into #t values
(111, '5/27/18 6:36 AM', '79 street, NY')
,(112, '5/27/18 6:53 AM', '79 street, NY')
,(113, '5/27/18 6:54 AM', '79 street, NY')
,(114, '5/27/18 6:55 AM', '79 street, NY')
,(115, '5/27/18 6:59 AM', '79 street, NY')
,(116, '5/27/18 9:45 PM', '79 street, NY')
,(117, '5/27/18 9:47 PM', '79 street, NY')
,(118, '3/24/18 6:35 AM', '44 tree ave,FL')
,(119, '3/24/18 6:36 AM', '44 tree ave,FL')
,(120, '3/24/18 6:36 AM', '44 tree ave,FL')
,(121, '3/24/18 6:36 AM', '2 pop ave, NJ');
--select * from #t;
IF OBJECT_ID('tempdb..#self') is not null DROP TABLE #self;
SELECT DISTINCT d1.trans_id 'trans_id1',d2.trans_id 'trans_id2', d1.trans_time 't1',d2.trans_time 't2'
INTO #self
FROM #t d1 JOIN #t d2 ON d1.store_address = d2.store_address --self join
AND DATEDIFF(minute,d1.trans_time,d2.trans_time) < 10
AND d1.trans_id <> d2.trans_id
AND d1.trans_id < d2.trans_id
IF OBJECT_ID('tempdb..#date') is not null DROP TABLE #date;
SELECT DISTINCT d.trans_id,d.trans_time,d.store_address
INTO #DATE
FROM #t d
JOIN #SELF dd ON d.trans_id=dd.trans_id1 or d.trans_id=dd.trans_id2
IF OBJECT_ID('tempdb..#address') is not null DROP TABLE #address;
SELECT store_address
INTO #address --address for min count 3 of store address
FROM #t
GROUP BY store_address HAVING COUNT(store_address) >= 3
SELECT * FROM #date d
JOIN #address a ON d.store_address = a.store_address