Standard Deviation for SQLite

后端 未结 10 696
生来不讨喜
生来不讨喜 2020-12-14 08:05

I\'ve searched the SQLite docs and couldn\'t find anything, but I\'ve also searched on Google and a few results appeared.

Does SQLite have any built-in Standard Devi

10条回答
  •  时光取名叫无心
    2020-12-14 08:51

    There is still no built-in stdev function in sqlite. However, you can define (as Alix has done) a user-defined aggregator function. Here is a complete example in 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])
    

    This will print:

    avg: 3.000000
    stdev: 1.581139
    

    Compare with MySQL: http://sqlfiddle.com/#!2/ad42f3/3/0

提交回复
热议问题