2016-11-25 4 views
0

Ich versuche, eine RMS-Funktion auf My MariaDB zu machen. Ich habe dieses Thema gefunden: Link.MariaDB wie man eine RMS Funktion macht?

Mit diesem Code:

WITH nums AS 
    (
    SELECT value, ROW_NUMBER() OVER (ORDER BY orderer) AS rn 
    FROM source 
    ) 
SELECT SQRT(AVG(POWER(np.value - nn.value, 2))) 
FROM nums np 
JOIN nums nn 
ON  nn.rn = np.rn + 1 

Das Problem ist, dass die SQL-Standard Common Table Expressions (CTE) nicht für meine Version nicht unterstützt (10.1.18-MariaDB). Die letzte auf dem Archarm Linux ist die Dinge für die Version 10.2.2: MDEV-8308

Fix und ich weiß nicht, wie man die gleiche Arbeit auf eine andere Art und Weise. Wenn jemand helfen kann.

+0

Google "simulieren Lead-Lag in MySQL" –

Antwort

0

Simulieren Sie ROW_NUMBER(), indem Sie eine tatsächliche Tabelle mit einer AUTO_INCREMENT erstellen, die PRIMARY KEY ist. Dann können Sie einen "Selbstbeitritt" dieses Tisches zu sich selbst machen. Es ist nur ein paar Tastenanschläge mehr als Ihr CTE Versuch:

CREATE TABLE nums (
    rn INT AUTO_INCREMENT PRIMARY KEY 
) ENGINE=InnoDB 
    SELECT value FROM source ORDER BY orderer; 

SELECT SQRT(AVG(POWER(np.value - nn.value, 2))) 
    FROM nums AS np 
    JOIN nums AS nn ON nn.rn = np.rn + 1; 

Hinweise:

  • Die id im CREATE TABLE zusätzlich zu value aus der kommenden SELECT wird definiert.
  • Dies setzt auto_increment_increment = 1 voraus. Wenn Sie Galera (usw.) verwenden, ändern Sie die +1 in + @@auto_increment_increment.
  • 10 wird nicht funktionieren, weil (bis vor kurzem) Sie diese Art von temporärer Tabelle nicht zweimal in derselben Abfrage verwenden konnten. (Warum? Schlägt mich!)