2017-08-25 4 views
1

Ich habe die folgende Tabelle:Berechnung Summe von Differenzen aus jeder Gruppe

Sensor | building | Date_time | Current_value 
1  | 1  | 20.08.2017 | 20 
1  | 1  | 21.08.2017 | 25 
1  | 1  | 22.08.2017 | 35 
2  | 1  | 20.08.2017 | 120 
2  | 1  | 21.08.2017 | 200 
2  | 1  | 22.08.2017 | 210 
3  | 2  | 20.08.2017 | 20 
3  | 2  | 21.08.2017 | 25 
3  | 2  | 22.08.2017 | 85 
5  | 2  | 20.08.2017 | 320 
5  | 2  | 21.08.2017 | 400 
5  | 2  | 22.08.2017 | 410 

Die Sensor-ID angenommen wird eindeutig sein, da das Gebäude ID ist.

Ich muss den Gesamtwert für jedes Gebäude für einen bestimmten Zeitrahmen berechnen, indem Sie den MIN-Wert vom MAX-Wert für jeden Sensor subtrahieren und dann die Summe für jedes Gebäude gruppieren.

In dem obigen Beispiel wäre es

sein
Sensor 1: (35 - 20)=15 
Sensor 2: (210-120)=90 
Building 1 = 15+90 = 105 
(...) 
Building 2 = 65+90 = 155 

Alle Zeiger in die richtige Richtung sind sehr zu schätzen!

+0

Insgesamt bedeutet, dass Sie das Hinzufügen Zeug. Was Sie jedoch beschreiben, ist die Summe von * Sensorunterschieden * pro Gebäude. –

+0

Ich muss die individuellen Unterschiede hinzufügen, da ein Gebäude mehrere Sensoren hat. Ich werde das Thema gerne umformulieren, um es klarer zu machen. –

Antwort

2

Sie fragen, wie Sie den Unterschied zwischen Min- und Max-Werten pro Sensor berechnen, dann Aggregat die Unterschiede pro Gebäude.

with diffs as (
    SELECT Building,Sensor, MAX(Current_Value)-MIN(Current_Value) as diff 
    FROM SomeTable 
    GROUP BY Building, Sensor 
) 
SELECT Building,sum(diff) 
FROM diffs 
GROUP BY Building 

Wenn Sie den Zeitraum einschränken möchten, werden Sie so innerhalb des CTE zu tun haben:

with diffs as (
    SELECT Building,Sensor, MAX(Current_Value)-MIN(Current_Value) as diff 
    FROM SomeTable 
    WHERE Date_Time between @start and @end 
    GROUP BY Building, Sensor 
) 
SELECT Building,sum(diff) 
FROM diffs 
GROUP BY Building 

Sie diese Abfrage in eine Funktion definiert Benutzer umwandeln kann, die in anderen verwendet werden können, Anfragen:

create function fn_TotalDiffs(@start datetime2(0), @end datetime2(0)) 
returns table 
as 
Return (
    with diffs as (
     select Building,Sensor, MAX(Current_Value)-MIN(Current_Value) as diff 
     from SomeTable 
     Group by Building, Sensor 
    ) 
    select Building,sum(diff) as Total 
    from diffs 
    Group by Building 
) 
2

Eine weitere Option Fensterfunktion min/max über()

Beispiel

Select Building 
     ,Total = sum(R1) 
From (
     Select Distinct 
       Building 
       ,R1 = max([Current_value]) over (Partition By Building,Sensor) 
        -min([Current_value]) over (Partition By Building,Sensor) 
     From YourTable 
     Where Date_time between @Date1 and @Date2 
    ) A  
Group By Building 

Returns

Building Total 
1   105 
2   155