簡體   English   中英

計算sqlite中的方差

[英]Calculate variance in sqlite

我想計算表列的方差。 例如,計算方差的公式包含聚合函數和標量函數,並且是:

(SUM((var-AVG(var))*(var-AVG(var))))/(COUNT(var)-1)

其中 var 是計算方差的變量列。

在 Sqlite 中使用此函數的最佳方法是什么,例如:

SELECT (SUM((var-AVG(var))*(var-AVG(var))))/(COUNT(var)-1) AS Variance FROM
TableX

AVG(var)的值將用於要求和的每個表達式中,因此您必須使用子查詢單獨計算它:

SELECT SUM((var-(SELECT AVG(var) FROM TableX))*
           (var-(SELECT AVG(var) FROM TableX)) ) / (COUNT(var)-1) AS Variance
FROM TableX

作為對上面 CL 回答的部分響應,我不確定 SELECT AVG(var) FROM TableX 是否被緩存或計算了兩次(因為它出現了兩次)。 對於大型表/視圖,這可能會成為一個問題。 您可能喜歡另一種選擇:-

SELECT diff_squared / [n-1] FROM
(
    SELECT diff * diff AS diff_squared FROM 
    (
        SELECT x - mean AS diff FROM 
        (
            SELECT [Var] AS x FROM TableX
        ) innerData
        LEFT JOIN
        (
            SELECT avg(x) AS mean FROM
            (
                SELECT [Var] AS x FROM TableX
            ) 
        ) stats
    ) outerData
) LEFT JOIN
(
    SELECT count(x) - 1 AS [n-1] FROM 
    (
        SELECT [Var] AS x FROM TableX
    )   
) nMinus1

我需要計算 5 分鍾的平均值,並希望以相同的 5 分鍾間隔計算方差。

簡而言之 :

  1. 創建 5 分鍾平均值的視圖
  2. 在這個線程中使用這個視圖來計算方差,就像上面的 CL 一樣,盡管我不同意COUNT()-1

也許不是很優雅,但對我來說更容易捕捉。 我用 LibreOffice Calc(VAR.P 函數)檢查了結果。

數據

數據位於名為magic的表中。

CREATE TABLE magic(
  "dt" TEXT,
  "qccm" REAL,
  PRIMARY KEY (dt)
);

創建 5 分鍾平均值的視圖

CREATE VIEW v_magic5m(
"dt",
"qccm",
)
AS SELECT
datetime(round(cast(strftime('%s',dt) AS INT)/300)*300, 'unixepoch') AS rndtime,
avg(qccm),
GROUP BY rndtime;

計算方差

WITH tmp
AS (
    SELECT
    datetime(round(cast(strftime('%s',dt) AS INT)/300)*300, 'unixepoch') AS rnd_dt, 
    qccm
    FROM magic
)
SELECT
    tmp.rnd_dt,
    v_magic5m.qccm AS avg_qccm,
    SUM( (tmp.qccm - v_magic5m.qccm)*(tmp.qccm - v_magic5m.qccm) ) / COUNT(tmp.qccm) AS var_qccm
FROM tmp
LEFT JOIN v_magic5m ON tmp.rnd_dt=v_magic5m.dt
GROUP BY tmp.rnd_dt;

輸出如下所示:

rnd_dt               avg_qccm          var_qccm        
-------------------  ----------------  ----------------
2021-04-28 09:55:00  334.292929292929  765.924293439445
2021-04-28 10:00:00  332.743333333333  571.924122222222
2021-04-28 10:05:00  333.04            501.165066666667

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM