Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Suma częściowa między różnymi rekordami przy użyciu SQL 2008

Jest to problem z lukami i wyspami, w którym każda wyspa kończy się rekordem „in”, a Ty chcesz zsumować wartości dla każdej wyspy.

Oto jedno podejście, które wykorzystuje liczbę kolejnych „in” do zdefiniowania grupy, a następnie sumę okien dla każdej grupy.

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 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie widoku z powiązanych tabel podrzędnych

  2. SQL Grant wykonuje się na wielu obiektach

  3. Przykład sys.dm_sql_referenced_entities() SQL Servera zwracającego jednostkę, która odwołuje się do połączonego serwera

  4. Korzystanie z TransactionScope z niezatwierdzonym odczytem - czy z (nolock) w SQL jest konieczne?

  5. Użyj COLUMNPROPERTY(), aby zwrócić informacje o kolumnie lub parametrze w SQL Server