declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
Die obige Auswahl gibt mir Folgendes zurück.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Wie bekomme ich folgendes:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Antworten:
SQL Fiddle Beispiel
Ausgabe
Bearbeiten: Dies ist eine allgemeine Lösung, die auf den meisten Datenbankplattformen funktioniert. Wenn es eine bessere Lösung für Ihre spezifische Plattform gibt (z. B. Gareths), verwenden Sie sie!
quelle
Die neueste Version von SQL Server (2012) ermöglicht Folgendes.
oder
Das geht noch schneller. Die partitionierte Version ist für mich in 34 Sekunden über 5 Millionen Zeilen abgeschlossen.
Vielen Dank an Peso, der den SQL-Team-Thread kommentiert hat, auf den in einer anderen Antwort verwiesen wird.
quelle
ROWS UNBOUNDED PRECEDING
anstelle von verwendenROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Es war mir nicht sofort klar, ob es funktionieren würde, aber es tat es :-)Ab SQL Server 2012 kann dies einfach sein:
weil
ORDER BY
Klausel fürSUM
standardmäßigRANGE UNBOUNDED PRECEDING AND CURRENT ROW
für Fensterrahmen bedeutet ("Allgemeine Bemerkungen" unter https://msdn.microsoft.com/en-us/library/ms189461.aspx )quelle
Eine CTE-Version, nur zum Spaß:
Kehrt zurück:
quelle
Erstellen wir zunächst eine Tabelle mit Dummy-Daten ->
hier trete ich demselben Tisch bei (SELF Joining)
ERGEBNIS:
hier gehen wir jetzt einfach den Somevalue von t2 summieren und wir werden die ans bekommen
Erwünschtes Ergebnis
Löschen Sie den Dummy-Tisch
quelle
rank()
andere Order-by-Klausel verwendet, um es zu lösen.Späte Antwort, zeigt aber noch eine Möglichkeit ...
Die kumulative Summengenerierung kann mit der
CROSS APPLY
Logik optimiert werden.Funktioniert besser als das
INNER JOIN
&,OVER Clause
wenn der tatsächliche Abfrageplan analysiert wird ...quelle
set io statistics on
und vergleichen Sie die CPU und die tatsächlichen Zeiten.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
quelle
correlated subquery
für jede einzelne Zeile der Ergebnismenge immer mehr Zeilen gescannt werden . Es wird keine laufende Summe beibehalten und die Daten werden einmal wie bei Fensterfunktionen gescannt.In diesem hervorragenden Beitrag ist eine viel schnellere CTE-Implementierung verfügbar: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
Das Problem in diesem Thread kann folgendermaßen ausgedrückt werden:
quelle
Sobald die Tabelle erstellt ist -
quelle
Oben (Pre-SQL12) sehen wir Beispiele wie diese: -
Effizienter...
quelle
Sie können diese einfache Abfrage für die progressive Berechnung verwenden:
quelle
Versuche dies
quelle
Versuche dies:
quelle
Die SQL-Lösung, die "ROWS ZWISCHEN UNBOUNDED PRECEDING AND CURRENT ROW" und "SUM" kombiniert, hat genau das getan, was ich erreichen wollte. Ich danke dir sehr!
Wenn es jemandem helfen kann, war hier mein Fall. Ich wollte +1 in einer Spalte kumulieren, wenn ein Hersteller als "Some Maker" gefunden wird (Beispiel). Wenn nicht, kein Inkrement, sondern das vorherige Inkrementergebnis anzeigen.
Also dieses Stück SQL:
Erlaubte mir so etwas zu bekommen:
Erklärung von oben: Es beginnt die Zählung von "Some Maker" mit 0, Some Maker wird gefunden und wir machen +1. Für Benutzer 1 wird MakerC gefunden, sodass wir nicht +1 ausführen, sondern die vertikale Anzahl von Some Maker bis zur nächsten Zeile auf 2 bleibt. Die Partitionierung erfolgt nach Benutzer. Wenn wir also den Benutzer wechseln, ist die kumulative Anzahl wieder auf Null.
Ich bin auf der Arbeit, ich möchte keinen Verdienst für diese Antwort, sagen Sie einfach Danke und zeigen Sie mein Beispiel, falls sich jemand in der gleichen Situation befindet. Ich habe versucht, SUM und PARTITION zu kombinieren, aber die erstaunliche Syntax "ROWS ZWISCHEN UNBOUNDED PRECEDING UND CURRENT ROW" hat die Aufgabe abgeschlossen.
Vielen Dank! Groaker
quelle
Ohne Verwendung eines kumulativen JOIN-Gehalts für eine Person, die mithilfe der folgenden Abfrage abgerufen wird:
quelle
Zum Beispiel: WENN Sie eine Tabelle mit zwei Spalten haben, ist eine ID und die zweite Nummer und möchte die kumulative Summe herausfinden.
quelle