【问题标题】:Looking for duplicate transactions within a 5 minutes over a 24 hour time period在 24 小时内的 5 分钟内查找重复交易
【发布时间】:2017-01-25 14:04:48
【问题描述】:

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

转接

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

【问题讨论】:

  • 请添加您的表架构和所需的结果。
  • 标记您正在使用的 dbms。 (那里有一些非 ANSI SQL。)
  • 我猜 Oracle 里面有 sysdate(MySQL 有 SYSDATE(),但它是一个函数)。
  • 向我们展示示例数据和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • 你是对的。是甲骨文

标签: sql oracle count


【解决方案1】:

我是在网上用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有两条记录。

【讨论】:

  • "trandate" + '-2 minute' 应该 trandate - interval '2' minute 如果你想要标准 SQL 也适用于 Oracle
  • 看不到您指定的 24 小时周期。
  • 我没有,因为看起来你知道如何处理,你不能添加where T1."trandate" &gt; sysdate -1吗?
  • 我收到了一个 ORA-01722:Juan Carlos 解决方案的无效号码。
  • 对不起,我没有oracle服务器来测试样本,但是逻辑在那里,只需检查正确的sintaxis。你的sql级别是多少?
【解决方案2】:

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

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

【讨论】:

  • MIK,这正是我所希望的!感谢您的帮助。
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2013-04-11
相关资源
最近更新 更多