Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Soma parcial entre diferentes registros usando SQL 2008


Este é um problema de lacunas e ilhas, onde cada ilha termina com um registro "in", e você deseja somar os valores em cada ilha.

Aqui está uma abordagem que usa a contagem de "in"s seguintes para definir o grupo e, em seguida, uma soma de janela sobre cada grupo.
select timestamp,
    case when val = 'out' 
        then val
        else sum(val) over(partition by grp order by timestamp)
    end as val,
    typerow
from (
    select t.*,
        sum(case when typerow = 'in' then 1 else 0 end) over(order by timestamp desc) grp
    from @table t
) t
order by timestamp

Demonstração no DB Fiddle :
timestamp               | val | typerow
:---------------------- | --: | :------
2018-06-03 13:30:00.000 |   6 | out    
2018-06-03 14:10:00.000 |   8 | out    
2018-06-03 14:30:00.000 |  17 | in     
2018-06-03 15:00:00.000 |   9 | out    
2018-06-03 15:30:00.000 |   4 | out    
2018-06-03 16:00:00.000 |   2 | out    
2018-06-03 17:05:00.000 |  23 | in     
2018-06-03 17:30:00.000 |   0 | out    
2018-06-03 18:15:00.000 |   7 | out    
2018-06-03 18:30:00.000 |   8 | in     
2018-06-03 19:00:00.000 |   5 | out