2012-10-12 92 views
2

我有一個包含以下字段的工作日誌表較大的區別:甲骨文 - 計數時間戳其中時間戳超過1小時

worklog_id, 
agent_name, 
ticket_number, 
timestamp, 
worklog_notes. 

我希望能夠指望取得其中如果工作日誌條目數agent_name,ticket_numbertimestamp(日期)是相同的,只有當兩個條目之間的時間大於1小時時,工作日誌條目才被計數。

示例:John Smith在票證12345上創建三個工作日誌條目。第一個時間戳是「2012年10月11日9:11:44 AM」,第二個時間戳是「2012年10月11日9:36:16 AM 「第三個時間戳是」10/11/2012 11:18:20 AM「。在這個例子中,我只想給兩個工作日誌條目的代理人信貸,因爲前兩個時間間隔不到一個小時。

我試過讓邏輯工作使用「where」子查詢,但無法讓它工作。誰會有他們可以提供的任何示例?謝謝! :)

回答

1

這是否得到你想要的?特定代理商在機票上的第一個輸入應始終計算在內,並且之後的輸入只應在自先前輸入後至少已經過去一小時後纔算入。

select agent_name, ticket_number, count(*) from (
    select agent_name, ticket_number, timestamp, 
     lag(timestamp) over 
      (partition by agent_name, ticket_number order by timestamp) prev_timestamp 
) 
from worklog 
where (prev_timestamp is null 
     or (timestamp - prev_timestamp) >= interval '1' hour 
    ) 
group by agent_name, ticket_number 

我不知道這正是你想要的東西 - 如果代理人保持先前條目的一個小時內添加條目,他們沒有將除了第一計數。所以增加大量更新的人會受到懲罰。

也許你真正想要的是計算在其中的更新是由不同的小時數:

select agent_name, ticket_number, count(distinct to_char(timestamp,'DD-MON-YYYY HH24') 
    from worklog 
    group by agent_name, ticket_number 
+0

非常感謝戴夫!我用你提供的第二個查詢去了,它像冠軍一樣工作!我不知道爲什麼我甚至從來沒有想過格式化時間戳來實現我所需要的......我在頂端也是如此,完全錯過了最簡單的事情! :) – user1741396

+0

[代碼]選擇劑 「AGENT_NAME」 ,總和(total_touches) 「total_touches」 ,總和(distinct_touches) 「distinct_touches」 從 (選擇a.agent_name作爲代理人 ,a.ticket_number如TICKET_NUMBER ,計數( a.worklog_id)作爲worklog_id ,其中a.agent_name ='john smith' 和a.ticket_number = 123456作爲不同工作日 作爲工作日誌_id ,計數(不同於to_char(a.timstamp,'dd-mon-yyyy hh24')) group by a.agent_name,a.ticket_number) group by agent [/ code] – user1741396