在24小时内查找5分钟内的重复交易

时间:2017-01-25 14:04:48

标签: sql oracle count

我正在寻找24小时内5分钟窗口之间的重复交易。我试图找到滥用其他用户访问权限的用户。这是我到目前为止所做的,但它只搜索过去5分钟,而不是搜索24小时。这是ORACLE。

SELECT p.id, Count(*) count
FROM tranledg tl,
     patron p
WHERE p.id = tl.patronid
  AND tl.trandate > (sysdate-5/1440)
  AND tl.plandesignation in ('1')
  AND p.id in (select id from tranledg tl where tl.trandate > (sysdate-1))
GROUP BY p.id
HAVING COUNT(*)> 1

示例数据:

赞助人

id  |  Name      
--------------------------
1   | Joe
2   | Henry
3   | Tom
4   | Mary
5   | Sue
6   | Marie

Tranledg

tranid  |  trandate              |   location    |  patronid     
--------------------------
1       |  2015-03-01 12:01:00   |   1500        |  1
2       |  2015-03-01 12:01:15   |   1500        |  2
3       |  2015-03-01 12:03:30   |   1500        |  1
4       |  2015-03-01 12:04:00   |   1500        |  3
5       |  2015-03-01 15:01:00   |   1500        |  4
6       |  2015-03-01 15:01:15   |   1500        |  4
7       |  2015-03-01 17:01:15   |   1500        |  2
8       |  2015-03-01 18:01:30   |   1500        |  1
9       |  2015-03-01 19:02:00   |   1500        |  3
10      |  2015-03-01 20:01:00   |   1500        |  4
11      |  2015-03-01 21:01:00   |   1500        |  5

我希望以下数据能够返回:

ID  |   COUNT
1   |    2
4   |    2

2 个答案:

答案 0 :(得分:0)

我在线使用Postgres,Oracle版本非常相似,只关注日期操作。

<强> SQL DEMO

你需要自我加入。

SELECT T1.patronid, count(*)
FROM Tranledg T1
JOIN Tranledg T2
  ON T2."trandate" BETWEEN T1."trandate" + '-2 minute' AND T1."trandate" + '2 minute'
 AND T1."patronid" = T2."patronid"
 AND T1."tranid" <> T2."tranid"
GROUP BY T1.patronid;

<强>输出

您需要修复数据,因此1有两条记录。

enter image description here

答案 1 :(得分:0)

您可以使用带有范围窗口的分析子句,如下所示:

select *
  from (select tranid
             , patronid
             , count(*) over(partition by patronid
                             order by trandate
                             range between       0 preceding
                                       and 5/60/24 following) count
          from tranledg
         where trandate >= sysdate-1)
 where count > 1

它将输出所有在5分钟范围内为同一patronid的更多事务处理的事务以及该范围内的事务计数(如果有更多事项,您没有指定要执行的操作超过一个这样的范围或当范围重叠时。)

测试数据的输出(没有sysdate已经通过的条件):

TRANID PATRONID COUNT
------ -------- -----
     1        1     2
     5        4     2