2017-01-25 24 views
0

我正在尋找24小時內的5分鐘窗口之間的重複交易。我正在嘗試查找用戶濫用其他用戶訪問權限。這是我迄今爲止的,但它只是搜索過去5分鐘,而不是搜索24小時內。這是ORACLE。在24小時內尋找5分鐘內的重複交易

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 
+1

請添加表模式和期望的結果。 – McNets

+0

標記您正在使用的dbms。 (有一些非ANSI SQL) – jarlh

+0

我在那裏用'sysdate'猜測Oracle(MySQL有'SYSDATE()',但它是一個函數)。 –

回答

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

+0

如果你想要標準的SQL,也可以在Oracle上運行,那麼''trandate'+'-2 minute''應該爲'trandate-interval'2'分鐘' –

+0

沒有看到你指定的是24小時的時間段。 – whgragso

+0

我沒有看起來像你知道如何處理,你不能添加一個'where T1。「trandate」> sysdate -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 
+0

MIK,這正是我所希望的!謝謝你的幫助。 – whgragso