2011-01-02 17 views
1

Ich habe folgendes Beispiel für den Ich mag würde Summen an jeder zur Verfügung stehenden Zeit berechnen:Zusammenfassung Berechnung für verschiedene Zeiten

timestamp device value 
2010-12-30 00:00 1 5 
2010-12-30 00:05 1 5 
2010-12-30 00:05 2 10 
2010-12-30 00:13 1 23 
2010-12-30 00:16 3 11 
2010-12-30 00:30 1 22 
2010-12-30 00:40 2 55 
2010-12-30 00:40 3 12 
2010-12-30 00:45 2 12 
2010-12-30 10:00 3 33 

Am Ende des Ergebnis sollte wie folgt aussehen:

timestamp Total 
2010-12-30 00:00 5 
2010-12-30 00:05 5 
2010-12-30 00:05 15 
2010-12-30 00:13 33 
2010-12-30 00:16 44 
2010-12-30 00:30 43 
2010-12-30 00:40 88 
2010-12-30 00:40 89 
2010-12-30 00:45 46 
2010-12-30 10:00 67 

Die Idee ist, dass ich für jeden Zeitstempel den letzten Wert für jedes Gerät abrufen und dann die Werte SUM up.

Zum Beispiel:

Für zeitstempel 2010-12-30 00:13 ich brauchen würde, um die folgenden Einträge zu nehmen und sie Summe:

2010-12-30 00:05 2 10 
2010-12-30 00:13 1 23 

Die Gesamt wäre dann 26. Für zeitstempel 2010-12-30 10:00 ich brauchen würde, nehmen die folgenden Zeilen:

2010-12-30 00:30 1 22 
2010-12-30 00:45 2 12 
2010-12-30 10:00 3 33 

Welche gibt 67 als die Summe.

Meine Idee war es, eine Abfrage zu erstellen, die die neuesten Werte für jedes Gerät für jeden Zeitstempel auswählen würde, aber ich bin schon bei der Auswahl der neuesten Werte für jedes Gerät für einen bestimmten Zeitstempel fest, so würde ich einige bitten Unterstützung.

+2

Wenn Sie Code oder XML zu veröffentlichen, ** ** bitte diese Zeilen im Texteditor markieren, und klicken Sie auf " Codebeispiele "({}) auf der Editor-Symbolleiste, um sie schön zu formatieren und zu markieren! –

+0

Diese erste Summe - für Timestamp 2010-12-30 00:13 - sollte das nicht 33 sein? Du meinst die 10 und 23 als Werte zusammenfassen, oder? –

+0

Wie viele Zeilen gibt es in Ihrer Datenbank? Ist Leistung ein Problem? –

Antwort

1

Hier ist ein Ansatz. Die Abfrage wählt alle Zeilen aus der Tabelle aus und verwendet dann outer apply, um den letzten Wert pro Gerät zusammenzufassen. Die Abfrage not exists filtert Zeilen heraus, die nicht die letzte Zeile für dieses Gerät sind.

select t1.timestamp 
,  last_rows_per_device.Total 
from @t t1 
outer apply 
     (
     select sum(t2.value) as Total 
     from @t t2 
     where (
        t2.timestamp < t1.timestamp 
        or (t2.timestamp = t1.timestamp and t2.device <= t1.device) 
       ) 
       and not exists 
       (
        select * 
        from @t t3 
        where t3.device = t2.device 
          and t2.timestamp < t3.timestamp 
          and t3.timestamp <= t1.timestamp 
       ) 
     ) last_rows_per_device 
order by 
     t1.timestamp 
,  t1.device 

Die Abfrage geht davon aus, dass (timestamp, device) einzigartig ist, und es ordnet Zeilen mit demselben Zeitstempel von Geräte-ID, ersten niedrigste Gerät.

Dies entspricht Ihrer Ausgabe:

timestamp    Total 
2010-12-30 00:00  5 
2010-12-30 00:05  5 
2010-12-30 00:05  15 
2010-12-30 00:13  33 
2010-12-30 00:16  44 
2010-12-30 00:30  43 
2010-12-30 00:40  77 
2010-12-30 00:40  89 
2010-12-30 00:45  46 
2010-12-30 10:00  67 

Quelle Daten:

declare @t table (timestamp datetime, device int, value int) 
insert @t (timestamp, device, value) 
      select '2010-12-30 00:00', 1, 5 
union all select '2010-12-30 00:05', 1, 5 
union all select '2010-12-30 00:05', 2, 10 
union all select '2010-12-30 00:13', 1, 23 
union all select '2010-12-30 00:16', 3, 11 
union all select '2010-12-30 00:30', 1, 22 
union all select '2010-12-30 00:40', 2, 55 
union all select '2010-12-30 00:40', 3, 12 
union all select '2010-12-30 00:45', 2, 12 
union all select '2010-12-30 10:00', 3, 33 
+0

Dieser funktioniert. Es ist ziemlich langsam, aber trotzdem danke. – Mark

Verwandte Themen