sql >> Databáze >  >> RDS >> Sqlserver

Částečný součet mezi různými záznamy pomocí SQL 2008

Toto je problém mezer a ostrovů, kde každý ostrov končí záznamem „in“ a vy chcete sečíst hodnoty na každém ostrově.

Zde je jeden přístup, který používá počet následujících "in" k definování skupiny a poté součet oken nad každou skupinou.

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

Ukázka na 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    



  1. Použití boolean v PL/SQL

  2. Oracle:proč nepoužívá paralelní spouštění?

  3. Klauzule Oracle WITH nevrací žádná data

  4. IF NOT EXISTS na spouštěči