MariaDB如何制作RMS功能?

MariaDB how to make an RMS function?

我尝试在 My MariaDB 上创建一个 RMS 函数。我找到了这个主题:Link.

使用此代码:

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

问题是我的版本 (10.1.18-MariaDB) 不支持 SQL 标准通用 Table 表达式 (CTE)。 Archarm 上的最后一个 Linux 版本 10.2.2 已修复:MDEV-8308

而且我不知道如何以不同的方式完成相同的工作。如果有人可以提供帮助。

通过创建一个带有 AUTO_INCREMENTPRIMARY KEY 的实际 table 来模拟 ROW_NUMBER()。然后你可以对 table 本身做一个 "self join"。这仅比您的 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;

备注:

  • CREATE TABLE 中定义的 id 将补充来自`SELECT.
  • value
  • 这假设 auto_increment_increment = 1。如果您使用的是 Galera(等),请将 +1 更改为 + @@auto_increment_increment
  • CREATE TEMPORARY TABLE 将不起作用,因为(直到最近)您不能在同一个查询中两次使用那种临时 table。 (为什么?打败我了!)