Oracle-计算另一个字段的值更改时两次之间的差异

时间:2017-10-25 14:38:11

标签: oracle

我需要计算oracle中另一个字段更改的时间。 例如,我有一个有3个字段的表。用户名,日期和状态,所有这些都是varchar。状态有两个值0,1。现在,如果一个用户改变状态发生,我需要计算它们之间的时间。实际上我想在status ='0'变为1之间进行计算。例如,20170101中的用户a有状态= 0到20170105,它们之间的差异日期是3,也是从20170107再次有状态='0'直到20170110,差异为2.所以2 + 3 = 5

用户名状态日期 a 0 20170101 1 20170105 0 0 20170107 1 20170110

用户名状态日 a 0 5

1 个答案:

答案 0 :(得分:0)

你可能正在寻找这样的东西。但是,这里有很多假设 - 请参阅我原来的帖子下的评论。在下面的解决方案中,我保留了" -1"从你奇怪的日期算术。如果没有状态1,我也会忽略状态0.如果可能连续的状态相同的行,我只会采用状态从0变为1的CONSECUTIVE行。如果可能的话,这可能不是正确的处理

with
  inputs ( username, status, dt ) as (
    select 'a', '0', '20170101' from dual union all
    select 'a', '1', '20170105' from dual union all
    select 'a', '0', '20170107' from dual union all
    select 'a', '1', '20170110' from dual
  )
-- End of SIMULATED inputs (for testing only, not part of the solution).
-- SQL query begins BELOW THIS LINE. Use your actual table and column names.
select username,
       sum(diff) as days_in_status_0
from   (
  select username,
         case when status = '1' 
               and lag(status) over (partition by username order by dt) = '0'
              then to_date(dt, 'yyyymmdd') - 
                   to_date(lag(dt) over(partition by username order by dt), 'yyyymmdd')
                   - 1
         end  as diff
  from   inputs
)
group by username
;

USERNAME  DAYS_IN_STATUS_0
--------  ----------------
a                        5