2017-01-25 5 views
0

24時間の間に5分のウィンドウ間で重複したトランザクションを探しています。私は他のユーザーのアクセスを悪用しているユーザーを見つけようとしています。ここまでは私がこれまで持っていたことはありますが、それは過去5分間だけを検索しており、24時間を検索していません。それはオラクルです。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

私はOracleに 'sysdate'と推測しています(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; 

OUTPUT

あなたはデータを修正する必要があり、その1は、2つのレコードを持っています。

enter image description here

+0

"trandate" + "-2分"は、Oracleでも動作する標準SQLが必要な場合は、「trandate-interval」2分です。 –

+0

24時間指定の場所は表示されません。 – whgragso

+0

あなたはそれをどう扱うか知っているように見えたので私はdidntしました。 'どこの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

関連する問題