2012-10-12 65 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