【问题标题】:Oracle - Counting timestamps where difference between timestamps greater than 1 hourOracle - 计算时间戳之间的差异大于 1 小时的时间戳
【发布时间】:2012-10-12 14:33:26
【问题描述】:

我有一个包含以下字段的工作日志表:

worklog_id,
agent_name,
ticket_number,
timestamp,
worklog_notes.  

我希望能够计算工作日志条目的数量,如果 agent_name、ticket_number 和 timestamp(日期)相同,则仅在两个条目之间的时间时才计算工作日志条目大于 1 小时。

示例:John Smith 在工单 12345 上创建了三个工作日志条目。第一个时间戳是“10/11/2012 9:11:44 AM”,第二个时间戳是“10/11/2012 9:36:16 AM”第三个时间戳是“10/11/2012 11:18:20 AM”。在此示例中,我只想将两个工作日志条目归功于代理,因为前两个条目相隔不到一个小时。

我已尝试使用“where”子查询使逻辑工作,但无法使其工作。有人可以提供任何示例吗?谢谢! :)

【问题讨论】:

    标签: oracle


    【解决方案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
    

    【讨论】:

    • 非常感谢戴夫!!我选择了你提供的第二个查询,它就像一个冠军!我不知道为什么我从来没有想过格式化时间戳来实现我所需要的......我太过分了,完全错过了最简单的事情! :)
    • [code]select agent "agent_name" ,sum(total_touches) "total_touches" ,sum(distinct_touches) "distinct_touches" from (select a.agent_name as agent ,a.ticket_number as ticket_number ,count(a .worklog_id) as worklog_id ,count(distinct to_char(a.timstamp,'dd-mon-yyyy hh24')) as distinct_touches from worklog a where a.agent_name = 'john smith' and a.ticket_number = 123456 group by a.agent_name ,a.ticket_number) 按代理分组[/code]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2011-09-30
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多