现在有一张表记录事件,包括操作,时间,机器,详细信息等字段。一个操作有一个开始事件和一个结束事件。需要根据各种条件的组合查询,其中一个条件就是看哪些操作时长是否有查过一定时间的(例如1分钟,结束事件的时间减去开始事件的时间)。如何在一条SQL语句完成上述查询,或者效率较高的多条查询也可以。需要能组合其他条件。

解决方案 »

  1.   

    可以将事件按照开始事件和结束事件分在两个字查询中,依据操作进行连接,即可计算出操作时长,可以在子查询中组合开始事结束事件的其他条件。大概是这么一种形式:
    select ……
    from 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=开始事件  and 开始事件的其他条件
    ) tabA join 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=结束事件  and 结束事件的其他条件
    ) tabB on tabA.操作 = tabB.操作where tabB.时间 -  tabA.时间  > 设定的时长
      

  2.   

    可以将开始事件和结束事件分在两个字查询中,即可计算出操作所用的时间,其他条件可以分在两个字查询中大概是这么一种形式:
    select ……
    from 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=开始事件  and 开始事件的其他条件
    ) tabA join 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=结束事件  and 结束事件的其他条件
    ) tabB on tabA.操作  =  tabB.操作
    where tabB.时间 - tabB.时间  >  设定的时长
      

  3.   

    您好,感谢您回答我下面的问题,您的答案很有启发,但还没有完全,您看是否能再帮帮忙,我好将100分给您。结果集中还要包括没有结束的事件。谢谢
    ===================================================================================没有结束事件就用“当前时间”减去开始事件的时间吗?如果是这样,It is so easy!select ……
    from 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=开始事件  and 开始事件的其他条件
    ) tabA left join 
    (
        select 事件,操作,时间,……
        from tabName 
        where 标识开始或结束事件的字段=结束事件  and 结束事件的其他条件
    ) tabB on tabA.操作  =  tabB.操作
    where nvl(tabB.时间,sysdate) - tabA.时间  >  设定的时长