2014-09-10 77 views
0

我只有這麼遠了交易:我如何發現,不到10分鐘的間隔使用時間戳在SQL

select timestamp, trans, Count(trans) 
From(
    Select to_char(CREATED_TIMESTAMP) as timestamp,SOURCE_MSISDN||DEST_MSISDN||AMOUNT as trans 
    From ADMDBMC.TRANSACTION_CASH 
    WHERE TO_date(CREATED_TIMESTAMP) > = '1-sep-2014' AND TO_date(CREATED_TIMESTAMP) < '2-sep-2014' 
    and STATUS_DESCRIPTION='SUCCESS' 
    ) 

group by timestamp,trans 
Having count(trans)>1 
order by count(trans) desc 
+0

查詢是好的它的結果是什麼? – 2014-09-10 11:03:32

+0

你爲什麼在(顯然)已經是'date'(或'timestamp')的列上應用'to_date()'函數。你所做的只是將'date'轉換成'varchar',然後將它轉換回'date'。這完全沒用。 – 2014-09-10 11:15:41

+0

我會更正的 @Zeshan我希望查詢只給我交易的時間少於10分鐘。 – Kax 2014-09-10 11:21:58

回答

0

我想你可以通過在10分鐘的最接近倍數截斷你的時間戳實現這一目標:你可以用regexp_replace(to_char(CREATED_TIMESTAMP, 'dd-Mon-yyyy hh24:mi'), '.$', '0')代替to_char(CREATED_TIMESTAMP) as timestamp,我認爲你的小組將會是好的。

編輯:以前的解決方案只在2個交易是10分鐘的相同倍數的一部分時才起作用。這是一個更好的:

Select * 
From 
(
    Select CREATED_TIMESTAMP, 
      SOURCE_MSISDN||DEST_MSISDN||AMOUNT as trans, 
      lag(CREATED_TIMESTAMP, 1, null) over (partition by SOURCE_MSISDN||DEST_MSISDN||AMOUNT order by CREATED_TIMESTAMP) as PREVIOUS_TIMESTAMP 
    From ADMDBMC.TRANSACTION_CASH 
    Where TO_date(CREATED_TIMESTAMP) >= '1-sep-2014' 
     And TO_date(CREATED_TIMESTAMP) < '2-sep-2014' 
     And STATUS_DESCRIPTION='SUCCESS' 
) 
where CREATED_TIMESTAMP <= PREVIOUS_TIMESTAMP + INTERVAL '10' MINUTE 

lag分析功能可以讓每一行前述由SOURCE_MSISDN/DEST_MSISDN/AMOUNT拼接識別同一組行的時間戳。然後,一旦我們有了這個,我們只需要檢查差異。

+0

我想檢查時間戳之間的時間..如果時間少於10分鐘,然後返回結果..例如,如果第一次時間戳爲1:03 AM和下一個時間戳是凌晨1:12然後那個交易應該出現在結果 – Kax 2014-09-10 12:05:29

+0

我認爲我的新解決方案現在很好,請參閱我的編輯。 – Emmanuel 2014-09-10 13:02:36

0

Emmanuels方法將返回假陰性,例如,如果一個交易在11:49在11:52

你可以使用超前或滯後與窗口選項聚合函數來得到一個較舊的排那麼當前的時間戳發生和第二並計算difference between two timestamps 或COUNT(*)與窗口,例如:

select * FROM ( Select to_char(CREATED_TIMESTAMP) as timestamp,SOURCE_MSISDN||DEST_MSISDN||AMOUNT as trans ,COUNT(*) OVER (PARTITION BY SOURCE_MSISDN||DEST_MSISDN||AMOUNT ORDER BY CREATED_TIMESTAMP RANGE NUMTODSINTERVAL(600,'SECOND') PRECEDING) L_OF_TRANS From ADMDBMC.TRANSACTION_CASH WHERE TO_date(CREATED_TIMESTAMP) > = '1-sep-2014' AND TO_date(CREATED_TIMESTAMP) < '2-sep-2014' and STATUS_DESCRIPTION='SUCCESS' ) WHERE L_OF_TRANS > 1

0

你應該嘗試使用to_dsinterval功能。減去時間戳會給出時間間隔,所以您可以使用to_dsinterval比較時間戳。例如:

select * 
from my_table x 
where x.timestamp1 - x.timestamp2 < to_dsinterval ('00 00:10:00'); 

在此示例中,timestamp1將是最近的時間戳。

+0

謝謝你...我不知道這個功能。 – Kax 2014-09-10 14:47:44

+0

如果它滿足您的問題,請隨時接受答案,謝謝Kax。 – tbone 2014-09-10 17:51:43

相關問題