sql >> Databasteknik >  >> RDS >> Sqlserver

Delsumma mellan olika poster med SQL 2008

Detta är ett problem med luckor och öar, där varje ö slutar med en "in"-post och du vill summera värdena på varje ö.

Här är ett tillvägagångssätt som använder antalet följande "in" för att definiera gruppen, och sedan en fönstersumma över varje grupp.

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

Demo på 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. PostgreSQL round(v numerisk, s int)

  2. Maximalt (användbart) antal rader i en Postgresql-tabell

  3. Skaffa tillgängliga timmar i klassrummet mellan datum och tidsintervall

  4. Lagring av affärslogik i databasen