28

SQLite ドキュメントを検索しましたが、何も見つかりませんでしたが、Google でも検索したところ、いくつかの結果が表示されました。

SQLite には標準偏差関数が組み込まれていますか?

4

10 に答える 10

28

SQL で分散を計算できます。

create table t (row int);
insert into t values (1),(2),(3);
SELECT AVG((t.row - sub.a) * (t.row - sub.a)) as var from t, 
    (SELECT AVG(row) AS a FROM t) AS sub;
0.666666666666667

ただし、標準偏差を取得するには平方根を計算する必要があります。

于 2011-01-06T23:53:59.477 に答える
20

SQLite でサポートされている集計関数は次のとおりです。

http://www.sqlite.org/lang_aggfunc.html

STDEV はリストにありません。

ただし、このページextension-functions.cのモジュールには STDEV 関数が含まれています。

于 2010-02-19T17:35:52.400 に答える
5

分散式 V(X) = E(X^2) - E(X)^2 を使用します。SQL sqlite では

SELECT AVG(col*col) - AVG(col)*AVG(col) FROM table

標準偏差を取得するには、平方根 V(X)^(1/2) を取る必要があります

于 2019-11-04T14:39:34.070 に答える
4

Welford 法( と同じextension-functions.c) を SQLite UDF として実装しました。

$db->sqliteCreateAggregate('stdev',
    function (&$context, $row, $data) // step callback
    {
        if (isset($context) !== true) // $context is null at first
        {
            $context = array
            (
                'k' => 0,
                'm' => 0,
                's' => 0,
            );
        }

        if (isset($data) === true) // the standard is non-NULL values only
        {
            $context['s'] += ($data - $context['m']) * ($data - ($context['m'] += ($data - $context['m']) / ++$context['k']));
        }

        return $context;
    },
    function (&$context, $row) // fini callback
    {
        if ($context['k'] > 0) // return NULL if no non-NULL values exist
        {
            return sqrt($context['s'] / $context['k']);
        }

        return null;
    },
1);

これは PHP ($dbは PDO オブジェクト) にありますが、別の言語に移植するのは簡単です。

SQLite はとてもクールです。<3

于 2013-08-27T16:03:12.487 に答える
3

ちょっとしたトリック

select ((sum(value)*sum(value) - sum(value * value))/((count(*)-1)*(count(*)))) 
from the_table ;

あとは外でsqrtを計算するだけです。

于 2016-05-18T07:37:58.967 に答える
2

いいえ、私はこの同じ問題を検索し、アプリケーション (PHP) で計算を行う必要がなくなりました

于 2010-02-19T17:35:22.797 に答える
1

Python 関数にいくつかのエラー検出を追加しました

class StdevFunc:
    """
    For use as an aggregate function in SQLite
    """
    def __init__(self):
        self.M = 0.0
        self.S = 0.0
        self.k = 0

    def step(self, value):
        try:
            # automatically convert text to float, like the rest of SQLite
            val = float(value) # if fails, skips this iteration, which also ignores nulls
            tM = self.M
            self.k += 1
            self.M += ((val - tM) / self.k)
            self.S += ((val - tM) * (val - self.M))
        except:
            pass

    def finalize(self):
        if self.k <= 1: # avoid division by zero
            return none
        else:
            return math.sqrt(self.S / (self.k-1))
于 2014-10-19T12:16:07.487 に答える