当前位置:  开发笔记 > 编程语言 > 正文

SQLite的标准偏差

如何解决《SQLite的标准偏差》经验,为你挑选了3个好方法。

我搜索过SQLite文档并找不到任何内容,但我也在谷歌上搜索了一些结果.

SQLite是否有任何内置的标准偏差功能?



1> 小智..:

您可以计算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

但是,您仍然需要计算平方根以获得标准偏差.



2> Robert Harve..:

SQLite支持的聚合函数在这里:

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

STDEV不在列表中.

然而,该模块extension-functions.c该页面包含一个STDEV功能.



3> alex.forenci..:

sqlite中仍然没有内置的stdev函数.但是,您可以定义(如Alix已完成的)用户定义的聚合器函数.这是Python中的完整示例:

import sqlite3
import math

class StdevFunc:
    def __init__(self):
        self.M = 0.0
        self.S = 0.0
        self.k = 1

    def step(self, value):
        if value is None:
            return
        tM = self.M
        self.M += (value - tM) / self.k
        self.S += (value - tM) * (value - self.M)
        self.k += 1

    def finalize(self):
        if self.k < 3:
            return None
        return math.sqrt(self.S / (self.k-2))

with sqlite3.connect(':memory:') as con:

    con.create_aggregate("stdev", 1, StdevFunc)

    cur = con.cursor()

    cur.execute("create table test(i)")
    cur.executemany("insert into test(i) values (?)", [(1,), (2,), (3,), (4,), (5,)])
    cur.execute("insert into test(i) values (null)")
    cur.execute("select avg(i) from test")
    print("avg: %f" % cur.fetchone()[0])
    cur.execute("select stdev(i) from test")
    print("stdev: %f" % cur.fetchone()[0])

这将打印:

avg: 3.000000
stdev: 1.581139

与MySQL比较:http://sqlfiddle.com/#!2/ad42f3/3/0

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有