Sql 在24小时内的5分钟内查找重复事务
我正在寻找在24小时内5分钟窗口之间的重复交易。我试图找到滥用其他用户访问权限的用户。这是我到目前为止得到的,但它只是搜索过去的5分钟,而不是搜索24小时。这是甲骨文Sql 在24小时内的5分钟内查找重复事务,sql,oracle,count,Sql,Oracle,Count,我正在寻找在24小时内5分钟窗口之间的重复交易。我试图找到滥用其他用户访问权限的用户。这是我到目前为止得到的,但它只是搜索过去的5分钟,而不是搜索24小时。这是甲骨文 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
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
我是用Postgres online做的,Oracle版本非常相似,只是对日期操作非常小心 你需要一个自我加入
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;
选择T1.patronid,count(*)
来自Tranledg T1
连接变速器T2
在T2上,T1和T1之间的“传输日期”+“-2分钟”和T1之间的“传输日期”+“2分钟”
T1.“用户ID”=T2.“用户ID”
T1.“tranid”T2.“tranid”
按T1.id分组;
输出
您需要修复数据,因此1有两条记录
您可以将分析子句与以下范围窗口一起使用:
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分钟范围内的所有交易,以及该范围内的交易计数(如果有多个这样的范围,或者当范围重叠时,您没有指定要做什么)
测试数据的输出(不带已通过的sysdate
条件):
请添加您的表架构和所需结果。标记您正在使用的dbms。(这里有一些非ANSI SQL。)我猜Oracle中有
sysdate
(MySQL有sysdate()
,但它是一个函数)。显示示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。你是对的。如果您希望标准SQL也能在OracleNot上运行,那么oracle“trandate”+“-2分钟”
应该trandate-interval“2分钟”
,因为您指定的是24小时。我不知道,因为看起来您知道如何处理它,您不能在T1的位置添加一个“trandate”>sysdate-1
?我收到一个ORA-01722:Juan Carlos解决方案的无效号码。很抱歉,我没有oracle服务器来测试该示例,但逻辑在那里,只需检查正确的地址即可。你的sql级别是多少?MIK,这正是我所希望的!谢谢你的帮助。
TRANID PATRONID COUNT
------ -------- -----
1 1 2
5 4 2