Berechnen Sie die laufende Summe in SQL Server
Einführung
Die Berechnung laufender Summen ist eine häufige Aufgabe bei der Datenanalyse. In SQL Server gibt es mehrere Möglichkeiten, dies zu erreichen, einschließlich der Verwendung von Fensterfunktionen, korrelierten Unterabfragen und Cursor-basierten Lösungen. Die Aggregate Set Statement-Technik ist eine Möglichkeit, Diskussionen anzuregen. Bei dieser Technik werden Zeilen in eine temporäre Tabelle mit einer leeren laufenden Summe eingefügt, die Tabelle in einer bestimmten Reihenfolge aktualisiert und schließlich die aktualisierte laufende Summe ausgewählt.
Kompetenzen zur Aggregation von Satzanweisungen
Die folgende Abfrage verwendet den Aggregate-Set-Anweisungstrick, um eine laufende Summe zu berechnen:
<code class="language-sql">INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal) SELECT id, somedate, somevalue, null FROM TestTable ORDER BY somedate DECLARE @RunningTotal int SET @RunningTotal = 0 UPDATE @AnotherTbl SET @RunningTotal = runningtotal = @RunningTotal + somevalue FROM @AnotherTbl</code>
Diese Methode gilt als effizient, da sie Zeilen in der Reihenfolge aktualisiert, in der sie abgerufen werden. Es bestehen jedoch Bedenken hinsichtlich der Zuverlässigkeit in allen Szenarien.
Eine Alternative zum Aggregat-Set-Anweisungstrick
1. Fensterfunktion:
SQL Server 2012 führte die OVER-Klausel ein, die die Verwendung von Fensterfunktionen (z. B. SUM mit kumulativer Aggregation) ermöglicht. Dies macht zusätzliche Tabellenoperationen überflüssig und vereinfacht Abfragen:
<code class="language-sql">SELECT somedate, somevalue, SUM(somevalue) OVER(ORDER BY somedate) AS RunningTotal FROM TestTable</code>
2. Zugehörige Unterabfrage:
Eine korrelierte Unterabfrage kann verwendet werden, um die laufende Summe für jede Zeile abzurufen:
<code class="language-sql">SELECT somedate, somevalue, ( SELECT SUM(somevalue) FROM TestTable b WHERE b.somedate < a.somedate ) AS RunningTotal FROM TestTable a</code>
3. Cursorbasierte Lösung:
Cursoren bieten einen Mechanismus, um Zeilen Schritt für Schritt (in einer bestimmten Reihenfolge) zu verarbeiten. Die folgende Cursor-basierte Lösung berechnet inkrementell die laufende Summe:
<code class="language-sql">DECLARE @TotalTable table(id int primary key, somedate date, somevalue int, runningtotal int) DECLARE forward_cursor CURSOR FAST_FORWARD FOR SELECT id, somedate, somevalue FROM TestTable ORDER BY somedate OPEN forward_cursor DECLARE @running_total int, @id int, @somedate date, @somevalue int SET @running_total = 0 FETCH NEXT FROM forward_cursor INTO @id, @somedate, @somevalue WHILE (@@FETCH_STATUS = 0) BEGIN SET @running_total = @running_total + @somevalue INSERT @TotalTable VALUES(@id, @somedate, @somevalue, @running_total) FETCH NEXT FROM forward_cursor INTO @id, @somedate, @somevalue END CLOSE forward_cursor DEALLOCATE forward_cursor SELECT * FROM @TotalTable</code>
Fazit
In SQL Server hängt die Wahl der Methode zur Berechnung laufender Summen von Faktoren wie Datengröße, Leistungsanforderungen und SQL Server-Version ab. Der „Aggregate-Set-Statement-Trick“ ist immer noch eine praktikable Option für effiziente Updates, und Fensterfunktionen bieten eine einfachere Syntax in neueren Versionen von SQL Server. Aus Gründen der Flexibilität und Kontrolle sollten korrelierte Unterabfragen und Cursor-basierte Lösungen in Betracht gezogen werden. Benchmarking wird empfohlen, um den besten Ansatz für ein bestimmtes Szenario zu ermitteln.
Das obige ist der detaillierte Inhalt vonWie kann man laufende Summen in SQL Server effizient berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!