Ich wollte Ihnen nur sagen, dass Sie Variablen in MySQL verwenden können, um analytische Funktionen nachzuahmen. SUM OVER könnte beispielsweise wie folgt durchgeführt werden:
SELECT amount,
@sum := @sum + amount as sum
FROM tbl
JOIN (SELECT @sum := 0) s
Wenn Sie PARTITION BY
möchten , es ist möglich, aber nur ein bisschen komplizierter. Grundsätzlich fügen Sie eine weitere @variable
hinzu um das Konto (oder was auch immer Sie partitionieren möchten) zu beobachten, nach Konto (oder Ihrer Variablen) zu sortieren und dann @sum
zurückzusetzen wenn sich das Konto ändert. Wie folgt:
SELECT account,
amount,
(case when @account != account then @sum := amount else @sum := @sum + amount end) as sum,
(case when @account != account then @account := account else @account end) as _
FROM (SELECT * FROM tbl ORDER BY account)
JOIN (SELECT @sum := 0) s
JOIN (SELECT @account := '') a
Sie werden zwei wesentliche Änderungen bemerken, die vorgenommen werden mussten, um den Partitionseffekt zu erreichen:
-
Die Haupttabelle (
tbl
) wird in eine Unterauswahl mit einemORDER BY
eingeschlossen Klausel. Dies ist notwendig, da MySQL den@account
ausführen soll Variablentests müssen die Werte bereits bestellt werden. Wenn dies nicht geschehen wäre, würden Sie sowohl falsche Summenwerte als auch Kontowerte erhalten. -
Es gibt eine 'zusätzliche' Spalte mit dem Alias
as _
. Sie können diese Spalte bei der Verwendung von Ergebnissen ignorieren, aber die Reihenfolge von@account
check und change müssen nach dem@sum
stehen überprüfen und ändern.Auch hiermit könnten Sie Ihre Spalten neu anordnen, wenn es Ihnen nichts ausmacht, dass das Konto das letzte ist. Dies geschieht durch den Abschluss des ersten
account
Spalte, da sie mit dem letzten_
dupliziert wird Spalte und dann offensichtlich den Alias _
umbenannt aufaccount
.
Ressourcen:
- http://dev.mysql.com/ doc/refman/5.0/en/user-variables.html
- https://stackoverflow.com/a/2563940/263175