现在有这么一张表 Table1 (工作人员状态变动流水表)
字段 为  D_Date (状态发生时间 YYYY-MM-DD HH24:MIMIS), C_USER(人员 VARCHAR2), C_STATUS(状态 char(1) ), C_SUBSTATUS(前一个状态 char(1)) 
例如:
 
2009-01-01 07:30:00  路人甲 1  0
2009-01-01 07:30:10  路人乙  2  1          
2009-01-01 07:30:20  路人甲  2  1
2009-01-01 07:30:30  路人甲  1  2             --路人甲 发生c_status = 1 的时长为: 00:00:10
2009-01-01 07:30:40  路人乙  1  2             --路人乙 发生c_status = 1 的时长为: 00:00:30
2009-01-01 07:30:50  路人乙  0  1
2009-01-01 07:31:00  路人甲  2  1
2009-01-01 07:31:10  路人乙  1  0            --路人乙 发生c_status = 1 的时长为: 00:00:20
2009-01-01 07:31:50  路人甲  1  2            --路人甲 发生c_status = 1 的时长为: 00:00:50
 
 
其中 D_Date记录的是C_STATUS开始的时间
 
现在要统计: 各个人员,C_STATUS = '1' 的最长持续时间 按天统计,例如: 
 
日期            人员      最长持续时间
2009-01-01  路人甲   00:00:50
2009-01-01  路人乙   00:00:30
 
请问如何做到高效的统计出所需要的数据 ,谢谢.

解决方案 »

  1.   

    select TO_CHAR(D_Date,'YYYY-MM-DD'),C_USER,max(tim*24*60*60)
      from (
    select D_Date,C_USER,C_STATUS,C_SUBSTATUS,D_Date-lag(D_Date,1,D_Date)over(partition by C_USER order by D_Date) tim
      from table ) aa
    where C_STATUS=1
    group by TO_CHAR(D_Date,'YYYY-MM-DD'),C_USER
    ;时长没有转成timestamp,不大熟悉。时长的单位转成了秒。
      

  2.   

    留个句号,不过好像统计数据有问题还是表达有问题?
    c_status =1 时长 是 它发生时 相对上一个 C_status 任意状态的时间差么?