Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hat mysql das Äquivalent zu den analytischen Funktionen von Oracle?

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:

  1. Die Haupttabelle (tbl ) wird in eine Unterauswahl mit einem ORDER 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.

  2. 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 auf account .

Ressourcen: