select m.* , n.*from
(
select* , (selectcount(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) +1 px from tb t
) m,
(
select* , (selectcount(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) +1 px from tb t
) n
where m.用户ID = n.用户ID and m.金额 = n.金额 and m.px = n.px -1and (n.时间 - m.时间) *24*60*60<=60
select m.* , n.* from ( select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t ) m, ( select * , (select count(1) from tb where 用户ID = t.用户ID and 金额 = t.金额 and 时间 < t.时间) + 1 px from tb t ) n where m.用户ID = n.用户ID and m.金额 = n.金额 and m.px = n.px - 1 and (n.时间 - m.时间) * 24 * 60 * 60 <= 60
WITH a AS (SELECT 1 user_id, 100 amt, TO_DATE ('20080520010101', 'yyyymmddhh24miss') times FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010141', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010301', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010401', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010501', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010601', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 1 user_id, 100 amt, TO_DATE ('20080520010801', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 2 user_id, 100 amt, TO_DATE ('20080520010101', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 2 user_id, 100 amt, TO_DATE ('20080520010141', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 3 user_id, 100 amt, TO_DATE ('20080520010301', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 3 user_id, 100 amt, TO_DATE ('20080520010401', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 4 user_id, 100 amt, TO_DATE ('20080520010501', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 4 user_id, 100 amt, TO_DATE ('20080520010601', 'yyyymmddhh24miss') FROM DUAL UNION ALL SELECT 4 user_id, 100 amt, TO_DATE ('20080520010801', 'yyyymmddhh24miss') FROM DUAL) 插入测试数据 Row# USER_ID AMT TIMES
SELECTuser_id, amt, times
FROM (SELECTuser_id, amt, times,
LAG (times, 1, times -1) OVER (PARTITION BYuser_id, amt ORDERBY times)
pre_times,
LEAD (times, 1, SYSDATE +1) OVER (PARTITION BYuser_id, amt ORDERBY times)
after_times
FROM a)
WHERE (times - pre_times) *1440<=1OR (after_times - times) *1440<=1