2016-11-25 38 views
0

我嘗試在My MariaDB上創建一個RMS函數。我找到了這個話題:LinkMariaDB如何製作RMS功能?

有了這個代碼:

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 

的問題是,SQL標準通用表表達式(CTE的)不支持我的版本(10.1.18-MariaDB的)。在Archarm Linux上的事情最後一個是固定的版本10.2.2:MDEV-8308

而且我不知道該怎麼做同樣的工作,以不同的方式。如果有人可以幫忙。

+0

谷歌 「模擬超前滯後在MySQL」 –

回答

0

模擬ROW_NUMBER()通過與AUTO_INCREMENT那是PRIMARY KEY創建實際的表。然後,您可以對該表進行自我加入。這只是幾個按鍵比你的CTE嘗試更多:

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; 

注:

  • idCREATE TABLE被定義將是除了value從`選擇未來。
  • 此處假設爲auto_increment_increment = 1。如果您使用Galera(等),請將+1更改爲+ @@auto_increment_increment
  • CREATE TEMPORARY TABLE不會起作用,因爲(直到最近)你不能在同一個查詢中使用的那種臨時表的兩倍。 (爲什麼?我就不清楚了!)