Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在24小时内的5分钟内查找重复事务_Sql_Oracle_Count - Fatal编程技术网

Sql 在24小时内的5分钟内查找重复事务

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

我正在寻找在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.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