我正在寻找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
答案 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有两条记录。
答案 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